




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章網(wǎng)絡(luò)安全編程基礎(chǔ)3*內(nèi)容提要Windows的內(nèi)部機(jī)制C語言的四個(gè)發(fā)展階段實(shí)現(xiàn)Socket編程、注冊(cè)表編程、定時(shí)器編程駐留程序編程和多線程編程。3.1網(wǎng)絡(luò)安全編程概述C語言可以在Windows下編程,同樣也可以在Linux下編程。編程是一項(xiàng)比較綜合的工作,除了熟練使用編程工具以外,還要了解系統(tǒng)本身的內(nèi)部工作機(jī)理和編程語言。3.1.1Windows內(nèi)部機(jī)制Windows是一個(gè)“基于事件的,消息驅(qū)動(dòng)的”操作系統(tǒng)。用戶進(jìn)行了影響窗口的動(dòng)作觸發(fā)“事件”系統(tǒng)檢測到后發(fā)給應(yīng)用程序“消息”處理*八個(gè)基本概念與Windows系統(tǒng)密切相關(guān)的八個(gè)基本概念分別是:窗口、程序、進(jìn)程、線程消息、事件、句柄、API與SDK。*窗口窗口是Windows本身以及Windows環(huán)境下的應(yīng)用程序的基本界面單位窗口是顯示在屏幕上的一個(gè)矩形區(qū)域具有標(biāo)題欄、狀態(tài)欄、最大化、最小化按鈕的標(biāo)準(zhǔn)方框叫窗口,按鈕也是特殊窗口是用戶與生成該窗口的應(yīng)用程序間的直觀接口窗口是受應(yīng)用程序控制的一部分矩形屏幕區(qū)控制窗口的大小、風(fēng)格、位置及內(nèi)容用戶角度應(yīng)用程序角度*程序通常說的程序都是指一個(gè)能讓計(jì)算機(jī)識(shí)別的文件接觸得最多的是以exe或者com作為擴(kuò)展名的文件。程序一組指令的集合例如:QQ程序,主要包括界面外觀控制指令集
socket網(wǎng)絡(luò)通訊指令集數(shù)據(jù)信息存儲(chǔ)指令集可以任何語言形式表現(xiàn):高級(jí)語言、匯編語言、機(jī)器語言*進(jìn)程進(jìn)程就是應(yīng)用程序的執(zhí)行實(shí)例(或稱一個(gè)執(zhí)行程序),進(jìn)程是程序動(dòng)態(tài)的描述。一個(gè)以exe作為擴(kuò)展名的文件,在沒有被執(zhí)行的時(shí)候稱之為應(yīng)用程序,當(dāng)用鼠標(biāo)雙擊執(zhí)行以后,就被操作系統(tǒng)作為一個(gè)進(jìn)程執(zhí)行了。當(dāng)關(guān)機(jī)或者在任務(wù)欄的圖標(biāo)上單擊鼠標(biāo)右鍵選“退出”時(shí),進(jìn)程便消亡,徹底結(jié)束了生命。進(jìn)程經(jīng)歷了由“創(chuàng)建”到“消亡”的生命期,而程序自始至終存在于你的硬盤上,不管計(jì)算機(jī)是否啟動(dòng)。查看當(dāng)前進(jìn)程如下圖*查看當(dāng)前進(jìn)程*線程線程是進(jìn)程的一個(gè)執(zhí)行單元,同一個(gè)進(jìn)程中的各個(gè)線程對(duì)應(yīng)于一組CPU指令、一組CPU寄存器以及一個(gè)堆棧??梢詮南螺d工具看出來原來的下載工具是單進(jìn)程單線程目前的下載工具是單進(jìn)程多線程*消息消息是應(yīng)用程序和計(jì)算機(jī)交互的途徑,在計(jì)算機(jī)上幾乎做每一個(gè)動(dòng)作都會(huì)產(chǎn)生一個(gè)消息鼠標(biāo)被移動(dòng)會(huì)產(chǎn)生WM_MOUSEMOVE消息,鼠標(biāo)左鍵被按下會(huì)產(chǎn)生WM_LBUTTONDOWN的消息鼠標(biāo)右鍵按下便產(chǎn)生WM_RBUTTONDOWN消息*事件、句柄事件如在程序運(yùn)行的過程中改變窗口的大小或者移動(dòng)窗口等,都會(huì)觸發(fā)相應(yīng)的“事件”,從而調(diào)用相關(guān)的事件處理函數(shù)。例如:BUTTONCLICK事件,觸發(fā)ONBUTTONCLICK()事件處理函數(shù)句柄句柄是一個(gè)指針,通過句柄就可以控制該句柄指向的對(duì)象。編寫程序總是要和各種句柄打交道的句柄是系統(tǒng)用來標(biāo)識(shí)不同對(duì)象類型的工具,如窗口、菜單等,這些東西在系統(tǒng)中被視為不同類型的對(duì)象,用不同的句柄將他們區(qū)分開來。例如:HWND、HDC、HBRUSH、HMENU、HPEN等等*API與SDKAPI是系統(tǒng)為應(yīng)用程序提供的一系列函數(shù)接口。英文ApplicationProgrammingInterface的縮寫,意思是“應(yīng)用程序接口”,SDK是英文SoftwareDevelopmentKit的縮寫,意思是“軟件開發(fā)工具包”,微軟提供了許多專門的SDK開發(fā)包,比如DirectX開發(fā)包和語音識(shí)別開發(fā)包等等。3.1.2學(xué)習(xí)Windows下編程學(xué)習(xí)語言,選擇語言和工具是第一步目前的編程語言有C、C++、C#、Java和匯編語言等等。從實(shí)用的角度來講,C/C++是最好的選擇,微軟公司的VisualC++是其相應(yīng)開發(fā)工具*開發(fā)工具在開發(fā)工具上,選擇比較流行的VC++6.0,而且最好是英文版本,主界面如圖所示*學(xué)習(xí)編程需要經(jīng)歷三大步1、讀程序在沒有閱讀過一份完整的源代碼之前,別指望能寫出有多好的程序!2、寫程序“萬丈高樓平底起”,編程貴在動(dòng)手,只要?jiǎng)邮秩懢涂梢粤?。還要依照自身的能力循序漸進(jìn)地寫3、積累功能代碼將平時(shí)自己寫的和自己已經(jīng)讀通的程序分類保存起來,建一個(gè)屬于自己的代碼庫3.1.3選擇編程工具目前流行兩大語法體系:Basic語系和C語系。同一個(gè)語系下語言的基本語法是一樣。兩大語系如圖所示。C語系中,目前兩大語言如日中天:C++和Java。C++適宜做系統(tǒng)軟件的開發(fā)、Java更適宜做網(wǎng)絡(luò)應(yīng)用開發(fā)。雖然VC++.NET已經(jīng)面世很久了,但是C++的開發(fā)工具目前主流依然是VC++6.0和C++Builder6.0。Java流行的開發(fā)工具比較多,比如:IBM公司的VisualAge和WebsphereStudio、Eclipse,Insprise公司JBuilder等等。*VC++6.0目前最常用的版本是VC++6.0。VC++有一套集成開發(fā)工具,其中包括各種編輯器、編譯工具、集成調(diào)試器等等下面通過一個(gè)程序來說明開發(fā)工具使用:File->New選擇project,輸入各項(xiàng)值,如圖:新建的是一個(gè)控制臺(tái)程序在左圖的界面下選擇創(chuàng)建工程的模板,選擇空模板“Anemptyproject”,點(diǎn)擊按鈕“Finish”,出現(xiàn)工程總結(jié)窗口,如右圖所示。為工程新加一個(gè)程序文件:File->New->FILES選擇C++SourceFile,取名,后進(jìn)入下面界面選擇BUILD->Execute執(zhí)行程序,出現(xiàn)結(jié)果*說明程序proj3_1.cpp代碼包括三行第一行:“#include<iostream.h>”意思是引入C++的基本輸入輸出函數(shù)庫,在C語言中引入的是“stdio.h”庫。在iostream.h文件中定義了cout的功能是輸出,endl的功能是回車換行。第二行:“voidmain()”,main()函數(shù)是C/C++的主函數(shù),void表示該函數(shù)沒有返回值。第四行:“cout<<"HelloC++"<<endl;”,“cout<<”功能是向屏幕輸出。3.2C語言發(fā)展的四個(gè)階段C語言經(jīng)過不斷的發(fā)展,在編程體系中可以將其分成四個(gè)階段。1、面向過程的C語言。2、面向?qū)ο蟮腃++語言。3、SDK編程。4、MFC編程(MicrosoftFoundationClass:微軟基類庫)。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的語法基礎(chǔ)上引入了類(Class)。面向過程編程,最基本的程序用C語言編寫如proj3_2.cpp所示。案例名稱:使用C語言編程程序名稱:proj3_2.cpp#include<stdio.h>main(){
printf("HelloDOS\n");}*案例3-1讀取命令行參數(shù)案例名稱:讀取命令行參數(shù)程序名稱:proj3_3.cpp
#include<stdio.h>int
main(int
argc,char*argv[]){
inti; for(i=1;i<argc;i++) {
printf("%s\n",argv[i]); } return0;}參數(shù)個(gè)數(shù)參數(shù)的值編譯后在命令行下運(yùn)行如下3.2.2面向?qū)ο蟮腃++語言面向?qū)ο蟪绦蛟O(shè)計(jì)語言可以將一些變量和函數(shù)封裝到類(Class)中當(dāng)變量被類封裝后,稱之為屬性或者數(shù)據(jù)成員當(dāng)函數(shù)被類封裝后,稱之為方法或者成員函數(shù)定義好的一個(gè)類,然后定義一個(gè)類的實(shí)例,這個(gè)實(shí)例就叫做對(duì)象,在C++中可以用類定義對(duì)象,使用方法如程序proj3_4.cpp所示。類屬性方法*在C++中定義類案例名稱:在C++中使用類程序名稱:proj3_4.cpp
#include<iostream.h>classperson{
public:
intheart;
char*name;
intrun() //定義成員函數(shù)run() { heart=heart+20; returnheart; }};
定義person類屬性方法private、protected*在C++中使用類voidmain(){
int
iRunStop;
personZhangSan;
ZhangS="張三";
ZhangSan.heart=72;
cout<<"姓名:"<<ZhangS<<endl;
cout<<"跑步前心跳"<<ZhangSan.heart<<endl; //run()為對(duì)象的方法
iRunStop=ZhangSan.run();
cout<<"跑步后心跳"<<iRunStop<<endl;}編譯運(yùn)行輸出結(jié)果如圖*將類定義與實(shí)現(xiàn)分離類的定義放在.h文件中,實(shí)現(xiàn)放在.cpp文件中,具體如proj3_5所示在proj3_5.h中有classperson{
public:
intheart;
char*name;
intrun() ;};
*將類定義與實(shí)現(xiàn)分離在proj3_5.cpp中有#include<iostream.h>#include“proj3_5.h”int
person::run(){heart=heart+20;returnheart;}voidmain(){ int
iRunStop;
personZhangSan;
ZhangS="張三"; ZhangSan.heart=72;
cout<<"姓名:"<<ZhangS<<endl;
cout<<"跑步前心跳"<<ZhangSan.heart<<endl;
iRunStop=ZhangSan.run();
cout<<"跑步后心跳"<<iRunStop<<endl;}3.2.3SDK編程C庫提供了許多函數(shù),可以直接拿來使用。比如利用C庫提供的DeleteFile函數(shù)來刪除一個(gè)文件,如程序proj3_6.cpp所示。案例名稱:調(diào)用C庫函數(shù)程序名稱:proj3_6.cpp
#include<stdio.h>#include<windows.h>intmain(){
DeleteFile("C:\\test.txt");
printf("刪除成功\n"); return0;}執(zhí)行結(jié)果如右圖C庫函數(shù)提供*編寫窗口應(yīng)用程序編寫對(duì)話框的語法如下面程序案例名稱:編寫對(duì)話框程序名稱:proj3_7.cpp#include<windows.h>intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,int
iCmdShow){
MessageBox(NULL,TEXT("Hello,Windows!"),TEXT("HelloMsg"),MB_OK); return0;}編譯執(zhí)行結(jié)果如圖*編寫窗口應(yīng)用程序工程類型要改為WIN32Application,如圖WIN32ConsoleApplication——主函數(shù)為main()WIN32Application——主函數(shù)為WinMain()*編寫窗口應(yīng)用程序WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,int
iCmdShow)參數(shù)一:hInstance
是當(dāng)前實(shí)例的句柄。在這里hInstance表示應(yīng)用程序本身。參數(shù)二:hPrevInstance總是為NULL,在Windows早期版本中使用,在32位版本中,統(tǒng)一程序運(yùn)行方式改變了,不在需要了!參數(shù)三:szCmdLine是運(yùn)行程序的命令行參數(shù)四:iCmdShow用于指定程序窗口最初的顯示模式,可以正常顯示,也可以在初始化就最大化或者最小化。案例3-2利用SDK函數(shù)創(chuàng)建窗口
程序名稱:proj3_8.cpp#include<windows.h>WNDCLASSwc;HWNDh_wnd;MSGmsg;/*消息處理函數(shù)wndProc的聲明*/longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);窗口對(duì)象窗口句柄Windows消息對(duì)象案例3-2利用SDK函數(shù)創(chuàng)建窗口/*winMain
函數(shù)的聲明*/intPASCALWinMain(HINSTANCE
h_CurInstance,HINSTANCE
h_PrevInstance,LPSTR
p_CmdLine,intm_Show){
/*初始化wndclass結(jié)構(gòu)變量*/
wc.lpfnWndProc=WindowProc;
wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName="TheMainClass";
/*注冊(cè)WndClass結(jié)構(gòu)變量*/
RegisterClass(&wc); 案例3-2利用SDK函數(shù)創(chuàng)建窗口/*創(chuàng)建窗口*/h_wnd=CreateWindow("TheMainClass","OurfirstWindow",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.wParam);}注冊(cè)的窗口名窗口標(biāo)題窗口樣式窗口左上角的位置窗口寬度與高度程序當(dāng)前句柄將消息發(fā)送給Windowproc案例3-2利用SDK函數(shù)創(chuàng)建窗口/*定義消息處理函數(shù)*/longWINAPIWindowProc(HWND
h_wnd,UINT
WinMsg,WPARAM
w_param,LPARAM
l_param){
if(WinMsg==WM_DESTROY) PostQuitMessage(0); returnDefWindowProc(h_wnd,WinMsg,w_param,l_param);}執(zhí)行結(jié)果如右圖3.2.4MFC編程SDK的功能非常強(qiáng)大,需要記很多的函數(shù)微軟將SDK的函數(shù)分類進(jìn)行封裝,這樣就誕生了MFC(MicrosoftFoundationClass)。MFC程序的最基本的程序骨架如proj3_9.cpp所示。3.2.4MFC編程#include<afxwin.h>class
sample:public
CFrameWnd{public: sample()//構(gòu)造函數(shù)
{ Create(NULL,"MyWindow");
MessageBox("My
Window","CFrame constructor"); }};
classApp:public
CWinApp{public: BOOLInitInstance(); BOOLExitInstance();};
類繼承3.2.4MFC編程//InitInstance函數(shù)的定義//BOOLApp::InitInstance(){ MessageBox(0,"MyWindow","InitInstance",MB_OK|MB_ICONASTERISK);
sample*obj;
obj=newsample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED); returnTRUE;}
//ExitInstance函數(shù)定義BOOLApp::ExitInstance(){ MessageBox(0,"MyWindow","ExitInstance",MB_OK|MB_ICONHAND); returnTRUE;}//創(chuàng)建應(yīng)用程序?qū)ο驛ppappobject;3.2.4MFC編程如果配置的執(zhí)行方式與前面一樣,則會(huì)出錯(cuò)3.2.4MFC編程兩種解決辦法新建工程時(shí)選擇MFCAppWizard(exe)在原來基礎(chǔ)上,project->setting設(shè)置中修改,如圖3.2.4MFC編程程序首先執(zhí)行最一行:Appappobject;申明了一個(gè)App對(duì)象實(shí)例,將自動(dòng)調(diào)用InitInstance()執(zhí)行第一句
MessageBox(0,"MyWindow","InitInstance",MB_OK|MB_ICONASTERISK);彈出第一個(gè)對(duì)話框3.2.4MFC編程接著程序執(zhí)行sample*obj;obj=newsample;當(dāng)Sample類對(duì)象實(shí)例化時(shí)自動(dòng)調(diào)用構(gòu)造函數(shù)
sample()//構(gòu)造函數(shù)
{ Create(NULL,"MyWindow");
MessageBox("My
Window","CFrame constructor"); }彈出對(duì)話框3.2.4MFC編程接著程序執(zhí)行m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);顯示主窗口(最大化)3.2.4MFC編程當(dāng)退出主窗口時(shí),系統(tǒng)自動(dòng)調(diào)用ExitInstance()執(zhí)行MessageBox(0,"MyWindow","ExitInstance",MB_OK|MB_ICONHAND);
彈出窗口如右圖案例3-3MFC的事件處理機(jī)制#include<afxwin.h>class
sample:public
CFrameWnd{public: sample()//構(gòu)造函數(shù)
{ Create(NULL,"MyWindow");
}voidOnLButtonDown(UINT,CPoint){MessageBox(“YouclickedtheleftMouseButton",“Helloworld“,0);}voidOnRButtonDown(UINT,CPoint){MessageBox(“YouclickedtherightMouseButton",“Helloworld“,0);}DECLARE_MESSAGE_MAP()};
案例3-3MFC的事件處理機(jī)制BEGIN_MESSAGE_MAP(sample,CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()END_MESSAGE_MAP()classApp:public
CWinApp{public: BOOLInitInstance(); BOOLExitInstance();};//InitInstance函數(shù)的定義//BOOLApp::InitInstance(){ sample*obj;
obj=newsample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED); returnTRUE;}案例3-3MFC的事件處理機(jī)制
//ExitInstance函數(shù)定義BOOLApp::ExitInstance(){ returnTRUE;}//創(chuàng)建應(yīng)用程序?qū)ο驛ppappobject;編譯運(yùn)行會(huì)在按下左鍵,右鍵時(shí)彈出對(duì)話框3.3網(wǎng)絡(luò)安全編程網(wǎng)絡(luò)安全基礎(chǔ)編程技術(shù)主要包括6個(gè)方面:Socket編程注冊(cè)表編程文件系統(tǒng)編程定時(shí)器編程駐留程序編程多線程編程。3.3.1Socket編程談網(wǎng)絡(luò)安全編程離開網(wǎng)絡(luò)編程就會(huì)大失其味,凡是基于網(wǎng)絡(luò)應(yīng)用的程序都離不開Socket。Socket的意思是套接字,是計(jì)算機(jī)與計(jì)算機(jī)之間通信的接口。Socket網(wǎng)絡(luò)編程一般采用服務(wù)器/客戶機(jī)模式,有兩種不同的套接字流套接字?jǐn)?shù)據(jù)報(bào)套接字流套接字的編程時(shí)序圖如下服務(wù)器客戶機(jī)
Socket()bind()listen()accept()read()write()close()Socket()connect()read()write()close()連接請(qǐng)求數(shù)據(jù)請(qǐng)求應(yīng)答數(shù)據(jù)數(shù)據(jù)報(bào)套接字的編程時(shí)序圖如下服務(wù)器客戶機(jī)
Socket()bind()readfrom()sendto()close()Socket()bind()readfrom()sendto()close()服務(wù)請(qǐng)求服務(wù)應(yīng)答3.3.1Socket編程使用Winsock提供的API函數(shù)是最基本的網(wǎng)絡(luò)編程技術(shù)程序proj3_11.cpp利用Socket獲得本機(jī)的IP地址和機(jī)器名附加:利用socket編程實(shí)現(xiàn)掃描網(wǎng)站端口3.3.1Socket編程案例名稱:使用Socket得到IP地址程序名稱:proj3_11.cpp
#include<winsock.h>#include<stdio.h>voidCheckIP(void)//CheckIP函數(shù),用于獲取本機(jī)IP地址{
WORDwVersionRequested;//用于存放Winsock版本的值
WSADATAwsaData;
charname[255];//用于存放主機(jī)名
PHOSTENThostinfo;
wVersionRequested=MAKEWORD(2,0); //調(diào)用MAKEWORD()函數(shù)獲得Winsock的版本,用于加載Winsock庫
3.3.1Socket編程
if(WSAStartup(wVersionRequested,&wsaData)==0){//加載Winsock庫,如果WSAStartup()函數(shù)的返回值為0,說明加載成功
if(gethostname(name,sizeof(name))==0) {//判斷是否成功的將本地主機(jī)名存放入由name參數(shù)指定的緩沖區(qū)中
if((hostinfo=gethostbyname(name))!=NULL) {//如果獲得主機(jī)名成功的話,調(diào)用inet_ntoa()函數(shù)取得IP地址
LPCSTRip=inet_ntoa(*(struct
in_addr*)*hostinfo->h_addr_list);
printf("本機(jī)的IP地址是:%s\n",ip);//輸出IP地址
printf("本機(jī)的名稱是:%s\n",name); } }
WSACleanup();//卸載Winsock庫,并釋放所有資源
}}
intmain(){
CheckIP();//調(diào)用CheckIP()函數(shù)獲得并輸出IP地址
return0;}3.3.1Socket編程由于采用main()函數(shù),所以工程采用“WIn32ConsoleApplication”編譯執(zhí)行,出現(xiàn)錯(cuò)誤,如圖3.3.1Socket編程消除錯(cuò)誤的方法是在project->settings->link->Object/librarymodules,加入“WS_32.lib”3.3.1Socket編程再編譯執(zhí)行就可得到*利用Socket實(shí)現(xiàn)簡單掃描器程序清單如下:#include<winsock2.h>#include“stdio.h”#progmacomment(lib,”ws2_32”)#include<stdlib.h>#include<windows.h>voidmain(){ WSADATAws;SOCKETs;
struct
sockaddr_in
addr;
intRESULT; longlRESULT;
*利用Socket實(shí)現(xiàn)簡單掃描器for(inti=1;i<200;i++) {
lRESULT=WSAStartup(0x0101,&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(“58:%iinactive\n”,i);WSACleanup();} else {printf(“58:%iactive\n”,i);}
Closesocket(s); }}這樣可以實(shí)現(xiàn)對(duì)某一網(wǎng)站的端口掃描建立連接3.3.2注冊(cè)表編程注冊(cè)表在計(jì)算機(jī)中由鍵名和鍵值組成,注冊(cè)表中存儲(chǔ)了Window操作系統(tǒng)的所有配置。黑客90%以上對(duì)Windows的攻擊手段都離不開讀寫注冊(cè)表。在運(yùn)行窗口中輸入“regedit”命令可以進(jìn)入注冊(cè)表,注冊(cè)表的界面如圖所示。
3.3.2注冊(cè)表編程注冊(cè)表的句柄可以由調(diào)用RegOpenKeyEx()和RegCreateKeyEx()函數(shù)得到的通過函數(shù)RegQueryValueEx()可以查詢注冊(cè)表某一項(xiàng)的值;通過函數(shù)RegSetValueEx()可以設(shè)置注冊(cè)表某一項(xiàng)的值RegCreateKeyEx()函數(shù)和RegSetValueEx()函數(shù)的使用方法如程序proj3_12.cpp所示案例名稱:操作注冊(cè)表#include<stdio.h>#include<windows.h>
main(){
HKEY
hKey1; DWORDdwDisposition; LONG
lRetCode; //創(chuàng)建
lRetCode=RegCreateKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\IniFileMapping\\WebSecurity", 0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE, NULL,&hKey1,&dwDisposition);
//如果創(chuàng)建失敗,顯示出錯(cuò)信息
if(lRetCode!=ERROR_SUCCESS){
printf("ErrorincreatingWebSecuritykey\n"); return(0);}
//設(shè)置第一個(gè)鍵值
lRetCode=RegSetValueEx(hKey1,"Hack_Name", 0,REG_SZ, (byte*)"sixage", 100); //設(shè)置第二個(gè)鍵值
lRetCode=RegSetValueEx(hKey1,"Hack_Hobby", 0,REG_SZ, (byte*)"Running", 100);
//如果創(chuàng)建失敗,顯示出錯(cuò)信息
if(lRetCode!=ERROR_SUCCESS){
printf("ErrorinsettingSection1value\n"); return(0);}
printf("注冊(cè)表編寫成功!\n"); return(0);}編譯運(yùn)行結(jié)果:*判斷是否中了“冰河”中了“冰河”的計(jì)算機(jī)注冊(cè)表都將被修改了,修改了擴(kuò)展名為txt的文件的打開方式,在注冊(cè)表中txt文件的打開方式定義在HKEY_CLASSES_ROOT主鍵下的“txtfile\shell\open\command”中,如圖所示。*判斷是否中了“冰河”案例名稱:判斷是否中了“冰河”程序名稱:proj3_13.cpp
#include<stdio.h>#include<windows.h>main(){ HKEYhKEY; LPCTSTRdata_Set="txtfile\\shell\\open\\command"; longret0=(RegOpenKeyEx(HKEY_CLASSES_ROOT, data_Set,0,KEY_READ,&hKEY)); if(ret0!=ERROR_SUCCESS)//如果無法打開hKEY,則終止程序的執(zhí)行
{ return0; }
*判斷是否中了“冰河”//查詢有關(guān)的數(shù)據(jù)
LPBYTEowner_Get=newBYTE[80]; DWORDtype_1=REG_EXPAND_SZ; DWORDcbData_1=80;
longret1=RegQueryValueEx(hKEY,NULL,NULL, &type_1,owner_Get,&cbData_1);
if(ret1!=ERROR_SUCCESS) { return0; }
if(strcmp((constchar*)owner_Get, "%systemroot%\\system32\\notepad.exe%1")==0) { printf("沒有中冰河"); } else { printf("可能中了冰河"); }
printf("\n");}鍵名為默認(rèn)(看注冊(cè)表)編譯執(zhí)行結(jié)果:*案例3-6更改登錄用戶名當(dāng)用戶登錄系統(tǒng)以后,注冊(cè)表中就會(huì)自動(dòng)記下用戶名,下次登錄時(shí)再把登錄名顯示出來,如圖所示。案例3-6更改登錄用戶名當(dāng)非法入侵計(jì)算機(jī)以后,同樣會(huì)留下非法登錄的用戶名,所以需要將用戶名修改回原來的值。該用戶名記錄在注冊(cè)表的HKEY_LOCAL_MACHINE主鍵下的SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon子鍵中,鍵的名稱是:DefaultUserName,如圖所示。*程序更改系統(tǒng)登錄用戶案例名稱:更改系統(tǒng)登錄用戶程序名稱:proj3_14.cpp
#include<stdio.h>#include<windows.h>
main(){ HKEYhKey1; LONGlRetCode;
lRetCode=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Winlogon", 0,KEY_WRITE, &hKey1 );
if(lRetCode!=ERROR_SUCCESS){
printf("Errorincreatingappname.inikey\n"); return(0);}
lRetCode=RegSetValueEx(hKey1,
"DefaultUserName", 0, REG_SZ, (byte*)"Hacker_sixage", 20);
if(lRetCode!=ERROR_SUCCESS){
printf("ErrorinsettingSection1value\n"); return(0);
}
printf("已經(jīng)將登錄名該成Hacker_sixage"); return(0);}編譯執(zhí)行當(dāng)我們重啟時(shí),登錄界面為3.3.3文件系統(tǒng)編程文件系統(tǒng)編程非常的重要,可以在DOS命令行下執(zhí)行的操作都可以使用程序?qū)崿F(xiàn)。在DOS命令行下使用命令“netuserHacker/add”添加一個(gè)用戶,同樣可以在程序中實(shí)現(xiàn),如程序proj3_15.cpp所示編譯執(zhí)行后可看到,已經(jīng)添加用戶HACKER源代碼如下頁#include<stdio.h>#include<windows.h>main(){
char*szCMD="netuserHacker/add"; BOOLbSuccess; PROCESS_INFORMATIONpiProcInfo; STARTUPINFOInfo;
Info.cb=sizeof(STARTUPINFO);
Info.lpReserved=NULL;
Info.lpDesktop=NULL;
Info.lpTitle=NULL;
Info.cbReserved2=0;
Info.lpReserved2=NULL;
bSuccess=CreateProcess(NULL,szCMD,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);
if(!bSuccess) printf("創(chuàng)建進(jìn)程失??!"); return1;}*文件拷貝和移動(dòng)案例名稱:文件拷貝和移動(dòng)程序名稱:proj3_16.cpp
#include<stdio.h>#include<windows.h>main(){
CopyFile("C:\\File1.txt","C:\\File2.txt",TRUE);
MoveFile("C:\\File1.txt","C:\\File3.txt"); return1;}編譯執(zhí)行后看到新的文件原有文件如果已存在file2.txt,則覆蓋重命名*系統(tǒng)時(shí)間案例名稱:系統(tǒng)時(shí)間程序名稱:proj3_17.cpp
#include<windows.h>#include<stdio.h>main(){
SYSTEMTIME
sysTime;
GetLocalTime(&sysTime);
printf("%d年%d月%d日%d時(shí)%d分%d秒\n",
sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,
sysTime.wMinute,sysTime.wSecond); return1;}編譯執(zhí)行,如圖3.3.4定時(shí)器編程著名的“CIH病毒”每年定時(shí)發(fā)作,其中需要利用定時(shí)器來控制程序的執(zhí)行。定時(shí)器程序分成兩大類,一類是循環(huán)執(zhí)行另一類是根據(jù)條件只執(zhí)行一次。在程序中加載定時(shí)器,如程序proj3_18所示。3.3.4定時(shí)器編程案例名稱:定時(shí)器編程程序名稱:proj3_18.cpp
#include<windows.h>WNDCLASSwc;HWNDh_wnd;MSGmsg;
/*消息處理函數(shù)wndProc的聲明*/longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);
/*winMain
函數(shù)的聲明*/intPASCALWinMain(HINSTANCE
h_CurInstance,HINSTANCEh_PrevInstance,LPSTR
p_CmdLine,intm_Show){
3.3.4定時(shí)器編程/*初始化wndclass結(jié)構(gòu)變量*/
wc.lpfnWndProc=WindowProc;
wc.hInstance=h_CurInstance;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName="TheMainClass";
/*注冊(cè)WndClass結(jié)構(gòu)變量*/
RegisterClass(&wc);/*創(chuàng)建窗口*/
h_wnd=CreateWindow("TheMainClass","OurfirstWindow",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.wParam);}3.3.4定時(shí)器編程#defineID_TIMER1/*定義消息處理函數(shù)*/longWINAPIWindowProc(HWND
h_wnd,UINT
WinMsg,WPARAMw_param,LPARAM
l_param){ staticBOOLfFlipFlop=FALSE; HBRUSHhBrush; HDChdc; PAINTSTRUCTps; RECTrc;3.3.4定時(shí)器編程switch(WinMsg){ caseWM_CREATE:
SetTimer(h_wnd,ID_TIMER,1000,NULL); return0; caseWM_TIMER:
MessageBeep(-1);
fFlipFlop=!fFlipFlop;
InvalidateRect(h_wnd,NULL,FALSE); return0; caseWM_PAINT:
hdc=BeginPaint(h_wnd,&ps);
GetClientRect(h_wnd,&rc);
hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(0,0,255));設(shè)置定時(shí)器觸發(fā)3.3.4定時(shí)器編程
FillRect(hdc,&rc,hBrush);
EndPaint(h_wnd,&ps);
DeleteObject(hBrush); return0;
caseWM_DESTROY:
KillTimer(h_wnd,ID_TIMER);
PostQuitMessage(0); return0; } returnDefWindowProc(h_wnd,WinMsg,w_param,l_param);}編譯執(zhí)行出現(xiàn)紅藍(lán)交替顯示窗口取消定時(shí)器3.3.5駐留程序編程一般程序運(yùn)行時(shí)都有窗口一般后門或病毒程序是后臺(tái)運(yù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)行3.3.5駐留程序編程程序運(yùn)行時(shí)不顯示界面,為了實(shí)現(xiàn)自動(dòng)駐留,一般有兩種方法更改注冊(cè)表啟動(dòng)項(xiàng)讓該程序與用戶的某一操作關(guān)聯(lián)比如:“冰河”木馬采用第二種方法當(dāng)用戶雙擊擴(kuò)展名為txt的文本文件時(shí),自動(dòng)加載“冰河”程序案例3-7“冰河”原型第一種方法實(shí)現(xiàn)起來比較簡單,注冊(cè)表的自啟動(dòng)項(xiàng)的鍵值在“HKEY_LOCAL_MACHINE”主鍵下的“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”子鍵中,如圖所示(可手工可程序添加)案例3-7“冰河”原型第二種方法的實(shí)現(xiàn)是使用“HKEY_CLASSES_ROOT”主鍵下“txtfile\shell\open\command”鍵程序?qū)崿F(xiàn)的功能是:當(dāng)用戶雙擊打開一個(gè)文本文件時(shí),先啟動(dòng)要駐留的程序,然后再啟動(dòng)記事本打開這個(gè)文本文件。關(guān)鍵:用戶雙擊的文本文件地址如何通過駐留程序傳遞給記事本。案例3-7“冰河”原型第一步,先修改注冊(cè)表關(guān)聯(lián)(可手工可程序)在“HKEY_CLASSES_ROOT”主鍵下“txtfile\shell\open\command”鍵值改為駐留程序(e:\proj3_20.exe%1)第二步就是實(shí)現(xiàn)關(guān)鍵部分,關(guān)鍵部分實(shí)現(xiàn)方法如proj3_20.cpp程序案例3-7“冰河”原型proj3_20.cpp源程序如下:#include<windows.h>WNDCLASSwc;HWNDh_wnd;MSGmsg;/*消息處理函數(shù)wndProc的聲明*/longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain
函數(shù)的聲明*/intPASCALWinMain(HINSTANCE
h_CurInstance, HINSTANCEh_PrevInstance,LPSTR
p_CmdLine,intm_Show){案例3-7“冰河”原型
BOOLbSuccess;
PROCESS_INFORMATION
piProcInfo;
STARTUPINFOInfo;
Info.cb=sizeof(STARTUPINFO);
Info.lpReserved=NULL;
Info.lpDesktop=NULL;
Info.lpTitle=NULL; Info.cbReserved2=0; Info.lpReserved2=NULL; charlpAppName[100];
strcpy(lpAppName,"notepad.exe"); 建立一個(gè)可以執(zhí)行DOS命令的對(duì)象案例3-7“冰河”原型if(strcmp(p_CmdLine,"")!=0)
strcat(lpAppName,p_CmdLine);bSuccess=CreateProcess(NULL,lpAppName,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo); /*初始化wndclass結(jié)構(gòu)變量*/
wc.lpfnWndProc=WindowProc;
wc.hInstance=h_CurInstance;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力行業(yè)員工薪酬福利合同
- 勞動(dòng)合同 月度范文
- 大型商業(yè)綜合體裝修合同
- 建筑工地安全施工合同書
- 廢舊物資循環(huán)利用合同項(xiàng)目2025
- 生產(chǎn)制造合同合作書
- 商品房購回合同條款
- 房地產(chǎn)租賃管理合同范本
- 訂單班人才培養(yǎng)協(xié)議(范本)
- 無機(jī)鹽產(chǎn)品在農(nóng)業(yè)領(lǐng)域的應(yīng)用考核試卷
- 放射性粒子植入的臨床護(hù)理
- 篆刻課件完整版本
- 營養(yǎng)不良護(hù)理查房
- 母嬰培訓(xùn)課件
- 醫(yī)療機(jī)構(gòu)消毒技術(shù)規(guī)范
- 主語從句趣味課件
- 肝脾破裂搶救預(yù)案及流程
- 《外國法制史》課件
- 新能源汽車維護(hù)與故障診斷全套課件
- 《計(jì)算機(jī)應(yīng)用基礎(chǔ)》教學(xué)教案-02文字錄入技術(shù)
- 2023年大疆科技行業(yè)發(fā)展概況分析及未來五年行業(yè)數(shù)據(jù)趨勢預(yù)測
評(píng)論
0/150
提交評(píng)論