版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第三章 網(wǎng)絡(luò)平安編程根底 .*內(nèi)容提要Windows的內(nèi)部機(jī)制C言語的四個開展階段實(shí)現(xiàn)Socket編程、注冊表編程、定時器編程駐留程序編程和多線程編程。.3.1 網(wǎng)絡(luò)平安編程概述 C言語可以在Windows下編程,同樣也可以在Linux下編程。編程是一項比較綜合的任務(wù),除了熟練運(yùn)用編程工具以外,還要了解系統(tǒng)本身的內(nèi)部任務(wù)機(jī)理和編程言語。.3.1.1 Windows內(nèi)部機(jī)制 Windows是一個“基于事件的,音訊驅(qū)動的操作系統(tǒng)。用戶進(jìn)展了影響窗口的動作觸發(fā)“事件系統(tǒng)檢測到后發(fā)給運(yùn)用程序“音訊處置.*八個根本概念與Windows系統(tǒng)親密相關(guān)的八個根本概念分別是:窗口、程序、進(jìn)程、線程音訊、事件、句
2、柄、API與SDK。.*窗 口窗口是Windows本身以及Windows 環(huán)境下的運(yùn)用程序的根本界面單位窗口是顯示在屏幕上的一個矩形區(qū)域具有標(biāo)題欄、形狀欄、最大化、最小化按鈕的規(guī)范方框叫窗口,按鈕也是特殊窗口是用戶與生成該窗口的運(yùn)用程序間的直觀接口窗口是受運(yùn)用程序控制的一部分矩形屏幕區(qū)控制窗口的大小、風(fēng)格、位置及內(nèi)容用戶角度運(yùn)用程序角度.*程 序通常說的程序都是指一個能讓計算機(jī)識別的文件接觸得最多的是以exe或者com作為擴(kuò)展名的文件。程序一組指令的集合例如:QQ程序, 主要包括 界面外觀控制指令集 socket網(wǎng)絡(luò)通訊指令集 數(shù)據(jù)信息存儲指令集可以任何言語方式表現(xiàn):高級言語、匯編言語、機(jī)器言
3、語.*進(jìn) 程進(jìn)程就是運(yùn)用程序的執(zhí)行實(shí)例或稱一個執(zhí)行程序,進(jìn)程是程序動態(tài)的描畫。一個以exe作為擴(kuò)展名的文件,在沒有被執(zhí)行的時候稱之為運(yùn)用程序,當(dāng)用鼠標(biāo)雙擊執(zhí)行以后,就被操作系統(tǒng)作為一個進(jìn)程執(zhí)行了。當(dāng)關(guān)機(jī)或者在義務(wù)欄的圖標(biāo)上單擊鼠標(biāo)右鍵選“退出時,進(jìn)程便消亡,徹底終了了生命。進(jìn)程閱歷了由“創(chuàng)建到“消亡的生命期,而程序自始至終存在于他的硬盤上,不論計算機(jī)能否啟動。查看當(dāng)前進(jìn)程如以下圖.*查看當(dāng)前進(jìn)程.*線 程線程是進(jìn)程的一個執(zhí)行單元,同一個進(jìn)程中的各個線程對應(yīng)于一組CPU指令、一組CPU存放器以及一個堆棧。可以從下載工具看出來原來的下載工具是單進(jìn)程單線程目前的下載工具是單進(jìn)程多線程.*消 息音訊是
4、運(yùn)用程序和計算機(jī)交互的途徑,在計算機(jī)上幾乎做每一個動作都會產(chǎn)生一個音訊鼠標(biāo)被挪動會產(chǎn)生WM_MOUSEMOVE音訊,鼠標(biāo)左鍵被按下會產(chǎn)生WM_LBUTTONDOWN的音訊鼠標(biāo)右鍵按下便產(chǎn)生WM_RBUTTONDOWN音訊.*事件 、 句柄事件如在程序運(yùn)轉(zhuǎn)的過程中改動窗口的大小或者挪動窗口等,都會觸發(fā)相應(yīng)的“事件,從而調(diào)用相關(guān)的事件處置函數(shù)。例如:BUTTONCLICK事件,觸發(fā)ONBUTTON CLICK()事件處置函數(shù)句柄句柄是一個指針,經(jīng)過句柄就可以控制該句柄指向的對象。編寫程序總是要和各種句柄打交道的句柄是系統(tǒng)用來標(biāo)識不同對象類型的工具,如窗口、菜單等,這些東西在系統(tǒng)中被視為不同類型的對
5、象,用不同的句柄將他們區(qū)分開來。例如:HWND、HDC、HBRUSH、HMENU、HPEN等等.*API與SDKAPI是系統(tǒng)為運(yùn)用程序提供的一系列函數(shù)接口。英文Application Programming Interface 的縮寫,意思是“運(yùn)用程序接口,SDK是英文Software Development Kit的縮寫,意思是“軟件開發(fā)工具包,微軟提供了許多專門的SDK開發(fā)包,比如DirectX開發(fā)包和語音識別開發(fā)包等等。.3.1.2 學(xué)習(xí)Windows下編程學(xué)習(xí)言語,選擇言語和工具是第一步目前的編程言語有C、C+、C#、Java和匯編言語等等。從適用的角度來講,C/C+是最好的選擇,微軟
6、公司的Visual C+是其相應(yīng)開發(fā)工具.*開發(fā)工具在開發(fā)工具上,選擇比較流行的VC+6.0,而且最好是英文版本,主界面如下圖.*學(xué)習(xí)編程需求閱歷三大步1、讀程序在沒有閱讀過一份完好的源代碼之前,別指望能寫出有多好的程序!2、寫程序“萬丈高樓平底起,編程貴在動手,只需動手去寫就可以了。還要按照本身的才干循序漸進(jìn)地寫3、積累功能代碼將平常本人寫的和本人曾經(jīng)讀通的程序分類保管起來,建一個屬于本人的代碼庫.3.1.3 選擇編程工具 目前流行兩大語法體系:Basic語系和C語系。同一個語系下言語的根本語法是一樣。兩大語系如下圖。C語系中,目前兩大言語如日中天:C+和Java。C+適宜做系統(tǒng)軟件的開發(fā)、
7、Java更適宜做網(wǎng)絡(luò)運(yùn)用開發(fā)。雖然VC+.NET曾經(jīng)面世很久了,但是C+的開發(fā)工具目前主流依然是VC+6.0和C+ Builder6.0。Java流行的開發(fā)工具比較多,比如:IBM公司的Visual Age和Websphere Studio、Eclipse,Insprise公司JBuilder等等。.*VC+6.0目前最常用的版本是VC+6.0。VC+有一套集成開發(fā)工具,其中包括各種編輯器、編譯工具、集成調(diào)試器等等下面經(jīng)過一個程序來闡明開發(fā)工具運(yùn)用:File-New選擇project,輸入各項值,如圖:.新建的是一個控制臺程序在左圖的界面下選擇創(chuàng)建工程的模板,選擇空模板“An empty pr
8、oject,點(diǎn)擊按鈕“Finish,出現(xiàn)工程總結(jié)窗口,如右圖所示。.為工程新加一個程序文件:File-New-FILES選擇C+Source File,取名,后進(jìn)入下面界面.選擇 BUILD-Execute執(zhí)行程序,出現(xiàn)結(jié)果.*闡明程序proj3_1.cpp代碼包括三行第一行:“#include 意思是引入C+的根本輸入輸出函數(shù)庫,在C言語中引入的是“stdio.h庫。在iostream.h文件中定義了cout的功能是輸出,endl的功能是回車換行。第二行:“void main(),main()函數(shù)是C/C+的主函數(shù),void表示該函數(shù)沒有前往值。第四行:“cout Hello C+endl;
9、,“cout功能是向屏幕輸出。.3.2 C言語開展的四個階段 C言語經(jīng)過不斷的開展,在編程體系中可以將其分成四個階段。1、面向過程的C言語。2、面向?qū)ο蟮腃+言語。3、SDK編程。4、MFC編程Microsoft Foundation Class:微軟基類庫。.3.2.1 面向過程的C言語 C言語功能非常強(qiáng)大Linux/Unix操作系統(tǒng)就是用C言語寫的, C言語直接調(diào)用操作系統(tǒng)提供的API函數(shù)可以編寫非常強(qiáng)大的程序。C和C+的最主要區(qū)別是:C言語中沒有類的概念,C+在C的語法根底上引入了類Class。面向過程編程,最根本的程序用C言語編寫如proj3_2.cpp所示。案例稱號:運(yùn)用C言語編程程
10、序稱號:proj3_2.cpp#include main()printf(Hello DOSn);.*案例3-1 讀取命令行參數(shù)案例稱號:讀取命令行參數(shù)程序稱號:proj3_3.cpp#include int main(int argc, char *argv )int i;for (i = 1; i argc; i+)printf(%sn, argvi);return 0;參數(shù)個數(shù)參數(shù)的值.編譯后在命令行下運(yùn)轉(zhuǎn)如下.3.2.2 面向?qū)ο蟮腃+言語面向?qū)ο蟪绦蛟O(shè)計言語可以將一些變量和函數(shù)封裝到類Class中當(dāng)變量被類封裝后,稱之為屬性或者數(shù)據(jù)成員當(dāng)函數(shù)被類封裝后,稱之為方法或者成員函數(shù)定義好的
11、一個類,然后定義一個類的實(shí)例,這個實(shí)例就叫做對象,在C+中可以用類定義對象,運(yùn)用方法如程序proj3_4.cpp所示。類屬性方法.*在C+中定義類案例稱號:在C+中運(yùn)用類程序稱號:proj3_4.cpp#include class person public: int heart; char *name; int run()/定義成員函數(shù)run()heart=heart+20;return heart;定義person類屬性方法private、protected.*在C+中運(yùn)用類void main()int iRunStop;person ZhangSan;ZhangS = 張三
12、;ZhangSan.heart = 72;cout姓名: ZhangS endl;cout跑步前心跳 ZhangSan.heart endl;/run()為對象的方法iRunStop = ZhangSan.run();cout跑步后心跳iRunStopendl;編譯運(yùn)轉(zhuǎn)輸出結(jié)果如圖.*將類定義與實(shí)現(xiàn)分別類的定義放在.h文件中,實(shí)現(xiàn)放在.cpp文件中,詳細(xì)如proj3_5所示在proj3_5.h中有class person public: int heart; char *name; int run();.*將類定義與實(shí)現(xiàn)分別在proj3_5.cpp中有#include #incl
13、ude “proj3_5.hint person: run() heart=heart+20; return heart;void main()int iRunStop;person ZhangSan;ZhangS = 張三;ZhangSan.heart = 72;cout姓名: ZhangS endl;cout跑步前心跳 ZhangSan.heart endl;iRunStop = ZhangSan.run();cout跑步后心跳iRunStopendl;.3.2.3 SDK編程C庫提供了許多函數(shù),可以直接拿來運(yùn)用。比如利用C庫提供的DeleteFile函數(shù)來刪除
14、一個文件,如程序proj3_6.cpp所示。案例稱號:調(diào)用C庫函數(shù)程序稱號:proj3_6.cpp#include #include int main()DeleteFile(C:test.txt);printf(刪除勝利n);return 0;執(zhí)行結(jié)果如右圖C庫函數(shù)提供.*編寫窗口運(yùn)用程序編寫對話框的語法如下面程序案例稱號:編寫對話框程序稱號:proj3_7.cpp#include int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)MessageBox
15、(NULL, TEXT (Hello, Windows!), TEXT (HelloMsg), MB_OK) ;return 0 ;編譯執(zhí)行結(jié)果如圖.*編寫窗口運(yùn)用程序工程類型要改為WIN32 Application,如圖WIN32 Console Application主函數(shù)為main()WIN32 Application主函數(shù)為WinMain().*編寫窗口運(yùn)用程序WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)參數(shù)一:hInstance 是當(dāng)前實(shí)例的句柄。在這里hIns
16、tance表示運(yùn)用程序本身。參數(shù)二: hPrevInstance總是為NULL,在Windows早期版本中運(yùn)用,在32位版本中,一致程序運(yùn)轉(zhuǎn)方式改動了,不在需求了!參數(shù)三: szCmdLine是運(yùn)轉(zhuǎn)程序的命令行參數(shù)四:iCmdShow用于指定程序窗口最初的顯示方式,可以正常顯示,也可以在初始化就最大化或者最小化。.案例3-2 利用SDK函數(shù)創(chuàng)建窗口 程序稱號:proj3_8.cpp#include WNDCLASS wc;HWND h_wnd;MSG msg;/* 音訊處置函數(shù)wndProc的聲明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM)
17、;窗口對象窗口句柄Windows音訊對象.案例3-2 利用SDK函數(shù)創(chuàng)建窗口/* winMain 函數(shù)的聲明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show) /*初始化wndclass構(gòu)造變量*/ wc.lpfnWndProc =WindowProc; wc.hInstance =h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName =T
18、heMainClass;/* 注冊WndClass構(gòu)造變量*/RegisterClass(&wc);.案例3-2 利用SDK函數(shù)創(chuàng)建窗口/* 創(chuàng)建窗口*/h_wnd=CreateWindow(TheMainClass,Our first Window,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0);/* 顯示窗口*/ShowWindow(h_wnd,SW_SHOWMAXIMIZED);/*音訊循環(huán)*/while(GetMessage(&msg,NULL,0,0)DispatchMessage(&msg); return (msg.wPa
19、ram );注冊的窗口名窗口標(biāo)題窗口款式窗口左上角的位置窗口寬度與高度程序當(dāng)前句柄將音訊發(fā)送給Windowproc.案例3-2 利用SDK函數(shù)創(chuàng)建窗口/* 定義音訊處置函數(shù)*/long WINAPI WindowProc(HWND h_wnd,UINT WinMsg,WPARAM w_param,LPARAM l_param)if(WinMsg=WM_DESTROY)PostQuitMessage(0);return DefWindowProc(h_wnd,WinMsg,w_param,l_param);執(zhí)行結(jié)果如右圖.3.2.4 MFC編程 SDK的功能非常強(qiáng)大,需求記很多的函數(shù)微軟將SDK
20、的函數(shù)分類進(jìn)展封裝,這樣就誕生了MFCMicrosoft Foundation Class。MFC程序的最根本的程序骨架如proj3_9.cpp所示。.3.2.4 MFC編程#includeclass sample:public CFrameWndpublic:sample() /構(gòu)造函數(shù)Create(NULL,My Window);MessageBox(My Window,CFrame constructor); class App:public CWinApppublic:BOOL InitInstance();BOOL ExitInstance();類承繼.3.2.4 MFC編程/Ini
21、tInstance函數(shù)的定義/BOOL App :InitInstance()MessageBox(0,My Window,InitInstance,MB_OK|MB_ICONASTERISK); sample *obj;obj=new sample;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);return TRUE;/ExitInstance函數(shù)定義BOOL App:ExitInstance()MessageBox(0,My Window,ExitInstance, MB_OK|MB_ICONHAND);return TRUE;/創(chuàng)建運(yùn)用程
22、序?qū)ο驛pp appobject;.3.2.4 MFC編程假設(shè)配置的執(zhí)行方式與前面一樣,那么會出錯.3.2.4 MFC編程兩種處理方法新建工程時選擇 MFC AppWizard(exe)在原來根底上,project-setting設(shè)置中修正,如圖.3.2.4 MFC編程程序首先執(zhí)行最一行:App appobject;聲明了一個App對象實(shí)例,將自動調(diào)用InitInstance()執(zhí)行第一句 MessageBox(0, My Window, InitInstance, MB_OK|MB_ICONASTERISK);彈出第一個對話框.3.2.4 MFC編程接著程序執(zhí)行 sample *obj; o
23、bj=new sample;當(dāng)Sample類對象實(shí)例化時自動調(diào)用構(gòu)造函數(shù) sample() /構(gòu)造函數(shù)Create(NULL,My Window);MessageBox(My Window,CFrame constructor);彈出對話框.3.2.4 MFC編程接著程序執(zhí)行m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);顯示主窗口(最大化).3.2.4 MFC編程當(dāng)退出主窗口時,系統(tǒng)自動調(diào)用ExitInstance()執(zhí)行MessageBox(0,My Window,ExitInstance, MB_OK|MB_ICONHAND);彈出窗口如右
24、圖.案例3-3 MFC的事件處置機(jī)制#includeclass sample:public CFrameWndpublic:sample() /構(gòu)造函數(shù)Create(NULL,My Window); void OnLButtonDown(UINT,CPoint) MessageBox(“You clicked the left Mouse Button,“Hello world“,0); void OnRButtonDown(UINT,CPoint) MessageBox(“You clicked the right Mouse Button,“Hello world“,0); DECLARE
25、_MESSAGE_MAP(); .案例3-3 MFC的事件處置機(jī)制BEGIN_MESSAGE_MAP(sample,CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()END_MESSAGE_MAP()class App:public CWinApppublic:BOOL InitInstance();BOOL ExitInstance();/InitInstance函數(shù)的定義/BOOL App :InitInstance()sample *obj;obj=new sample;m_pMainWnd=obj;obj-ShowWindow(SW_SHO
26、WMAXIMIZED);return TRUE;.案例3-3 MFC的事件處置機(jī)制/ExitInstance函數(shù)定義BOOL App:ExitInstance()return TRUE;/創(chuàng)建運(yùn)用程序?qū)ο驛pp appobject;編譯運(yùn)轉(zhuǎn)會在按下左鍵,右鍵時彈出對話框.3.3 網(wǎng)絡(luò)平安編程 網(wǎng)絡(luò)平安根底編程技術(shù)主要包括6個方面:Socket編程注冊表編程文件系統(tǒng)編程定時器編程駐留程序編程多線程編程。.3.3.1 Socket編程談網(wǎng)絡(luò)平安編程分開網(wǎng)絡(luò)編程就會大失其味,凡是基于網(wǎng)絡(luò)運(yùn)用的程序都離不開Socket。Socket的意思是套接字,是計算機(jī)與計算機(jī)之間通訊的接口。Socket網(wǎng)絡(luò)編程普
27、通采用效力器/客戶機(jī)方式,有兩種不同的套接字流套接字?jǐn)?shù)據(jù)報套接字.流套接字的編程時序圖如下效力器 客戶機(jī) Socket()bind()listen()accept()read()write()close()Socket()connect()read()write()close()銜接懇求數(shù)據(jù)懇求應(yīng)對數(shù)據(jù).數(shù)據(jù)報套接字的編程時序圖如下效力器 客戶機(jī) Socket()bind()readfrom()sendto()close()Socket()bind()readfrom()sendto()close()效力懇求效力應(yīng)對.3.3.1 Socket編程運(yùn)用Winsock提供的API函數(shù)是最根本的網(wǎng)絡(luò)
28、編程技術(shù)程序proj3_11.cpp利用Socket獲得本機(jī)的IP地址和機(jī)器名附加:利用socket編程實(shí)現(xiàn)掃描網(wǎng)站端口.3.3.1 Socket編程案例稱號:運(yùn)用Socket得到IP地址程序稱號:proj3_11.cpp#include #include void CheckIP(void) /CheckIP函數(shù),用于獲取本機(jī)IP地址 WORD wVersionRequested;/用于存放Winsock版本的值 WSADATA wsaData;char name255;/用于存放主機(jī)名PHOSTENT hostinfo;wVersionRequested = MAKEWORD( 2, 0
29、);/調(diào)用MAKEWORD()函數(shù)獲得Winsock的版本,用于加載Winsock庫.3.3.1 Socket編程 if ( WSAStartup( wVersionRequested, &wsaData ) = 0 ) /加載Winsock庫,假設(shè)WSAStartup()函數(shù)的前往值為0,闡明加載勝利if( gethostname ( name, sizeof(name) = 0) /判別能否勝利的將本地主機(jī)名存放入由name參數(shù)指定的緩沖區(qū)中 if(hostinfo = gethostbyname(name) != NULL) /假設(shè)獲得主機(jī)名勝利的話,調(diào)用inet_ntoa()函數(shù)獲得I
30、P地址 LPCSTR ip = inet_ntoa ( *(struct in_addr *)*hostinfo-h_addr_list); printf(本機(jī)的IP地址是:%sn,ip);/輸出IP地址 printf(本機(jī)的稱號是:%sn,name); WSACleanup( );/卸載Winsock庫,并釋放一切資源 int main()CheckIP();/調(diào)用CheckIP()函數(shù)獲得并輸出IP地址return 0;.3.3.1 Socket編程由于采用main()函數(shù),所以工程采用“WIn32 Console Application編譯執(zhí)行,出現(xiàn)錯誤,如圖.3.3.1 Socket編
31、程消除錯誤的方法是在project-settings-link-Object/library modules,參與“WS_32.lib.3.3.1 Socket編程再編譯執(zhí)行就可得到.*利用Socket實(shí)現(xiàn)簡單掃描器程序清單如下:#include #include “stdio.h#progma comment(lib,ws2_32)#include #include void main()WSADATA ws; SOCKET s;struct sockaddr_in addr;int RESULT;long lRESULT;.*利用Socket實(shí)現(xiàn)簡單掃描器for (int i=1;i200
32、;i+) lRESULT=WSAStartup(0 x0101,&ws);s=socket(PF_INET,SOCK_STREAM,0); addr.sin_family=PF_INET; addr.sin_addr.s_addr=inet_addr(“58);addr.sin_port=htons(i); if (s=INVALID_SOCKET) break; RESULT=connect(s,(struct sockaddr*)&addr,sizeof(addr); if(RESULT!=0)/銜接失敗,闡明該端口沒開放 printf(“162.105.195.
33、158:%i inactiven,i); WSACleanup(); else printf(“58:%i activen,i); Closesocket(s); 這樣可以實(shí)現(xiàn)對某一網(wǎng)站的端口掃描建立銜接.3.3.2 注冊表編程 注冊表在計算機(jī)中由鍵名和鍵值組成,注冊表中存儲了Window操作系統(tǒng)的一切配置。黑客90%以上對Windows的攻擊手段都離不開讀寫注冊表。在運(yùn)轉(zhuǎn)窗口中輸入“regedit命令可以進(jìn)入注冊表,注冊表的界面如下圖。 .3.3.2 注冊表編程注冊表的句柄可以由調(diào)用RegOpenKeyEx()和RegCreateKeyEx()函數(shù)得到的經(jīng)過函數(shù)Re
34、gQueryValueEx()可以查詢注冊表某一項的值;經(jīng)過函數(shù)RegSetValueEx()可以設(shè)置注冊表某一項的值RegCreateKeyEx()函數(shù)和RegSetValueEx()函數(shù)的運(yùn)用方法如程序proj3_12.cpp所示.案例稱號:操作注冊表#include #include main() HKEY hKey1; DWORD dwDisposition; LONG lRetCode; /創(chuàng)建 lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftWindows NTCurrentVersionIniFil
35、eMappingWebSecurity, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey1, &dwDisposition); /假設(shè)創(chuàng)建失敗,顯示出錯信息 if (lRetCode != ERROR_SUCCESS) printf (Error in creating WebSecurity keyn); return (0) ; ./設(shè)置第一個鍵值lRetCode = RegSetValueEx ( hKey1, Hack_Name, 0, REG_SZ, (byte*)sixage, 100); /設(shè)置第二個鍵值lRetC
36、ode = RegSetValueEx ( hKey1, Hack_Hobby, 0, REG_SZ, (byte*)Running, 100); /假設(shè)創(chuàng)建失敗,顯示出錯信息 if (lRetCode != ERROR_SUCCESS) printf ( Error in setting Section1 valuen); return (0) ; printf(注冊表編寫勝利!n);return(0); .編譯運(yùn)轉(zhuǎn)結(jié)果:.*判別能否中了“冰河 中了“冰河的計算機(jī)注冊表都將被修正了,修正了擴(kuò)展名為txt的文件的翻開方式,在注冊表中txt文件的翻開方式定義在HKEY_CLASSES_ROOT主
37、鍵下的“txtfileshellopencommand中,如下圖。.*判別能否中了“冰河案例稱號:判別能否中了“冰河程序稱號:proj3_13.cpp#include #include main() HKEY hKEY; LPCTSTR data_Set = txtfileshellopencommand; long ret0 = (RegOpenKeyEx(HKEY_CLASSES_ROOT,data_Set, 0, KEY_READ,&hKEY); if(ret0 != ERROR_SUCCESS) /假設(shè)無法翻開hKEY,那么終止程序的執(zhí)行 return 0; .*判別能否中了“冰河/查
38、詢有關(guān)的數(shù)據(jù)LPBYTE owner_Get = new BYTE80; DWORD type_1 = REG_EXPAND_SZ ; DWORD cbData_1 = 80; long ret1=RegQueryValueEx(hKEY, NULL, NULL,&type_1, owner_Get, &cbData_1); if(ret1!=ERROR_SUCCESS) return 0; if(strcmp(const char *)owner_Get,%systemroot%system32notepad.exe %1) = 0)printf(沒有中冰河);elseprintf(能夠中了
39、冰河);printf(n);鍵名為默許看注冊表.編譯執(zhí)行結(jié)果:.*案例3-6 更改登錄用戶名 當(dāng)用戶登錄系統(tǒng)以后,注冊表中就會自動記下用戶名,下次登錄時再把登錄名顯示出來,如下圖。.案例3-6 更改登錄用戶名當(dāng)非法入侵計算機(jī)以后,同樣會留下非法登錄的用戶名,所以需求將用戶名修正回原來的值。該用戶名記錄在注冊表的HKEY_LOCAL_MACHINE主鍵下的SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon子鍵中,鍵的稱號是:DefaultUserName,如下圖。.*程序更改系統(tǒng)登錄用戶案例稱號:更改系統(tǒng)登錄用戶程序稱號:proj3_14.cpp#
40、include #include main() HKEY hKey1; LONG lRetCode; lRetCode = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon, 0, KEY_WRITE, &hKey1); .if (lRetCode != ERROR_SUCCESS) printf (Error in creating appname.ini keyn); return (0) ; lRetCode = RegSetValueEx ( hKey1, Defau
41、ltUserName, 0, REG_SZ, (byte*)Hacker_sixage, 20); if (lRetCode != ERROR_SUCCESS) printf ( Error in setting Section1 valuen); return (0) ; printf(曾經(jīng)將登錄名該成Hacker_sixage);return(0); .編譯執(zhí)行當(dāng)我們重啟時,登錄界面為.3.3.3 文件系統(tǒng)編程文件系統(tǒng)編程非常的重要,可以在DOS命令行下執(zhí)行的操作都可以運(yùn)用程序?qū)崿F(xiàn)。在DOS命令行下運(yùn)用命令“net user Hacker /add添加一個用戶,同樣可以在程序中實(shí)現(xiàn),如程序
42、proj3_15.cpp所示編譯執(zhí)行后可看到,曾經(jīng)添加用戶HACKER源代碼如下頁.#include #include main()char * szCMD = net user Hacker /add;BOOL bSuccess;PROCESS_INFORMATION piProcInfo;STARTUPINFO Info;Info.cb=sizeof(STARTUPINFO);Info.lpReserved=NULL;Info.lpDesktop=NULL;Info.lpTitle=NULL;Info.cbReserved2=0;Info.lpReserved2=NULL;bSuccess
43、=CreateProcess(NULL,szCMD,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);if(!bSuccess)printf(創(chuàng)建進(jìn)程失敗!);return 1;.*文件拷貝和挪動案例稱號:文件拷貝和挪動程序稱號:proj3_16.cpp#include #include main()CopyFile(C:File1.txt,C:File2.txt,TRUE);MoveFile(C:File1.txt,C:File3.txt);return 1;編譯執(zhí)行后看到新的文件原有文件假設(shè)已存在file2.txt,那么覆蓋重命名.*系統(tǒng)時
44、間案例稱號:系統(tǒng)時間程序稱號:proj3_17.cpp#include #include main()SYSTEMTIME sysTime;GetLocalTime(&sysTime);printf(%d年%d月%d日%d時%d分%d秒n,sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);return 1;編譯執(zhí)行,如圖.3.3.4 定時器編程 著名的“CIH病毒每年定時發(fā)作,其中需求利用定時器來控制程序的執(zhí)行。定時器程序分成兩大類,一類是循環(huán)執(zhí)行另一類是根據(jù)條件只執(zhí)
45、行一次。在程序中加載定時器,如程序proj3_18所示。.3.3.4 定時器編程案例稱號:定時器編程程序稱號:proj3_18.cpp#include WNDCLASS wc;HWND h_wnd;MSG msg;/* 音訊處置函數(shù)wndProc的聲明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/* winMain 函數(shù)的聲明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show).3.3.4定時器編程
46、/*初始化wndclass構(gòu)造變量*/wc.lpfnWndProc =WindowProc;wc.hInstance =h_CurInstance;wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName =TheMainClass;/* 注冊WndClass構(gòu)造變量*/RegisterClass(&wc);/* 創(chuàng)建窗口*/h_wnd=CreateWindow(TheMainClass,Our first Window,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInst
47、ance,0);/* 顯示窗口*/ShowWindow(h_wnd,SW_SHOWMAXIMIZED);/*音訊循環(huán)*/while(GetMessage(&msg,NULL,0,0) DispatchMessage(&msg);return (msg.wParam );.3.3.4定時器編程#define ID_TIMER 1/* 定義音訊處置函數(shù)*/long WINAPI WindowProc(HWND h_wnd,UINT WinMsg, WPARAM w_param,LPARAM l_param)static BOOL fFlipFlop = FALSE ;HBRUSH hBrush ;
48、HDC hdc ;PAINTSTRUCT ps ;RECT rc ;.3.3.4定時器編程switch (WinMsg)case WM_CREATE:SetTimer (h_wnd, ID_TIMER, 1000, NULL) ;return 0 ;case WM_TIMER :MessageBeep (-1) ; fFlipFlop = !fFlipFlop ;InvalidateRect (h_wnd, NULL, FALSE) ;return 0 ;case WM_PAINT :hdc = BeginPaint (h_wnd, &ps) ;GetClientRect (h_wnd, &r
49、c) ;hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255) ;設(shè)置定時器觸發(fā).3.3.4定時器編程FillRect (hdc, &rc, hBrush) ;EndPaint (h_wnd, &ps) ;DeleteObject (hBrush) ;return 0 ;case WM_DESTROY :KillTimer (h_wnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;return DefWindowProc(h_wnd,WinMsg,w_param,l_para
50、m);編譯執(zhí)行出現(xiàn)紅藍(lán)交替顯示窗口取消定時器.3.3.5 駐留程序編程 普通程序運(yùn)轉(zhuǎn)時都有窗口普通后門或病毒程序是后臺運(yùn)轉(zhuǎn)的即駐留程序其實(shí)編寫駐留程序很方便,在上述 proj3_18.cpp中將ShowWindow()函數(shù)的“SW_SHOWMAXMIZED改為“SW_HIDE即可??蓞⒖磒roj3_19.cpp中 ShowWindow(h_wnd, SW_HIDE);.3.3.5 駐留程序編程編譯執(zhí)行沒有任何顯示,翻開義務(wù)管理器,可以看到proj3_19.exe正在運(yùn)轉(zhuǎn).3.3.5 駐留程序編程程序運(yùn)轉(zhuǎn)時不顯示界面,為了實(shí)現(xiàn)自動駐留,普通有兩種方法更改注冊表啟動項讓該程序與用戶的某一操作關(guān)聯(lián)比
51、如:“冰河木馬采用第二種方法當(dāng)用戶雙擊擴(kuò)展名為txt的文本文件時,自動加載“冰河程序.案例3-7 “冰河原型 第一種方法實(shí)現(xiàn)起來比較簡單,注冊表的自啟動項的鍵值在“HKEY_LOCAL_MACHINE主鍵下的“SOFTWAREMicrosoftWindowsCurrentVersion Run子鍵中,如下圖可手工可程序添加.案例3-7 “冰河原型第二種方法的實(shí)現(xiàn)是運(yùn)用“HKEY_CLASSES_ROOT主鍵下“txtfileshellopencommand鍵程序?qū)崿F(xiàn)的功能是:當(dāng)用戶雙擊翻開一個文本文件時,先啟動要駐留的程序,然后再啟動記事本翻開這個文本文件。關(guān)鍵:用戶雙擊的文本文件地址如何經(jīng)過
52、駐留程序傳送給記事本。.案例3-7 “冰河原型第一步,先修正注冊表關(guān)聯(lián)可手工可程序在“HKEY_CLASSES_ROOT主鍵下“txtfileshellopencommand鍵值改為駐留程序e:proj3_20.exe %1第二步就是實(shí)現(xiàn)關(guān)鍵部分,關(guān)鍵部分實(shí)現(xiàn)方法如proj3_20.cpp程序.案例3-7 “冰河原型proj3_20.cpp源程序如下:#include WNDCLASS wc;HWND h_wnd;MSG msg;/* 音訊處置函數(shù)wndProc的聲明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/* winMain 函數(shù)的
53、聲明*/int PASCAL WinMain(HINSTANCE h_CurInstance, HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show).案例3-7 “冰河原型BOOL bSuccess;PROCESS_INFORMATION piProcInfo;STARTUPINFO Info;Info.cb = sizeof(STARTUPINFO);Info.lpReserved = NULL;Info.lpDesktop = NULL;Info.lpTitle = NULL;Info.cbReserved2 = 0;Info.lpRes
54、erved2 = NULL;char lpAppName100;strcpy(lpAppName, notepad.exe );建立一個可以執(zhí)行DOS命令的對象.案例3-7 “冰河原型if(strcmp(p_CmdLine,)!=0) strcat(lpAppName, p_CmdLine);bSuccess=CreateProcess(NULL,lpAppName,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);/*初始化wndclass構(gòu)造變量*/wc.lpfnWndProc =WindowProc;wc.hInstance =h_CurInstance;wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName =TheMainClass;實(shí)現(xiàn)記事本翻開文件以下就是本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社群健康助理員安全風(fēng)險評優(yōu)考核試卷含答案
- 碳匯計量評估師安全規(guī)程模擬考核試卷含答案
- 西式面點(diǎn)師安全生產(chǎn)基礎(chǔ)知識強(qiáng)化考核試卷含答案
- 澆冰師安全文化評優(yōu)考核試卷含答案
- 2026秋招:泰山財產(chǎn)保險股份公司筆試題及答案
- 保潔員安全文化能力考核試卷含答案
- 多點(diǎn)相關(guān)定位系統(tǒng)機(jī)務(wù)員安全操作強(qiáng)化考核試卷含答案
- 溶劑油裝置操作工崗前工藝規(guī)程考核試卷含答案
- 野生植物采集工崗前實(shí)操操作考核試卷含答案
- 2026秋招:貴州磷化集團(tuán)筆試題及答案
- 抖音酒水運(yùn)營知識培訓(xùn)
- 【語文】重慶市沙坪壩區(qū)樹人小學(xué)小學(xué)一年級上冊期末試題
- 護(hù)理管道安全管理制度
- (正式版)DB65∕T 4617-2022 《公路橋梁預(yù)應(yīng)力孔道壓漿密實(shí)度檢測及評定規(guī)范》
- 醫(yī)用煮沸槽使用課件
- 初中寒假計劃課件
- 專升本語文教學(xué)課件
- 別人買房子給我合同范本
- 電力通信培訓(xùn)課件
- 中建三局2024年項目經(jīng)理思維導(dǎo)圖
- 基層黨建知識測試題及答案
評論
0/150
提交評論