1、第1页第三章第三章网络安全编程基础网络安全编程基础3.1网络安全编程概述网络安全编程概述3.2C语言发展的语言发展的4个阶段个阶段3.3网络安全编程网络安全编程docin/sundae_meng第2页内容提要内容提要n网络安全编程主要涉及的是操作系统编程,在网络安全编程主要涉及的是操作系统编程,在Windows平台下,目前主要采用平台下,目前主要采用C/C+语言。语言。n本章将介绍本章将介绍Windows操作系统的基本原理以及操作系统的基本原理以及C语言的四个发展阶段,每一阶段都用典型的语言的四个发展阶段,每一阶段都用典型的案例说明。案例说明。n详细说明在网络安全领域如何使用详细说明在网络安全
2、领域如何使用C/C+语言语言实现实现Socket编程、注册表编程、定时器编程、编程、注册表编程、定时器编程、驻留程序编程和多线程编程。驻留程序编程和多线程编程。docin/sundae_meng第3页网络安全编程概述网络安全编程概述n从理论上说,任何一门语言可以在任何从理论上说,任何一门语言可以在任何一个操作系统上编程,一个操作系统上编程,C语言可以在语言可以在Windows下编程,同样也可以在下编程,同样也可以在Linux下下编程。编程。n编程是一项比较综合的工作,除了熟练编程是一项比较综合的工作,除了熟练使用编程工具以外,还要了解系统本身使用编程工具以外,还要了解系统本身的内部工作机理和编
3、程语言。的内部工作机理和编程语言。docin/sundae_meng第4页Windows内部机制内部机制nWindows是一个是一个“基于事件的,消息驱动的基于事件的,消息驱动的”操作系统。在操作系统。在Windows下执行一个程序,只要下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相或移动、单击鼠标等)该动作就会触发一个相应的应的“事件事件”。n系统每次检测到一个事件时,就会给程序发送系统每次检测到一个事件时,就会给程序发送一个一个“消息消息”,从而使程序可以处理该事件。,从而使程序可以处理该事件。n
4、每次检测到一个用户事件,程序就对该事件做每次检测到一个用户事件,程序就对该事件做出响应,处理完以后,再等待下一个事件的发出响应,处理完以后,再等待下一个事件的发生。生。docin/sundae_meng第5页八个基本概念八个基本概念n与与Windows系统密切相关的八个基本概系统密切相关的八个基本概念分别是:念分别是:n窗口、程序、进程、线程窗口、程序、进程、线程n消息、事件、句柄、消息、事件、句柄、API与与SDK。docin/sundae_meng第6页1、窗口、窗口n窗口是窗口是Windows本身以及本身以及Windows环境环境下的应用程序的基本界面单位,但是很下的应用程序的基本界面单
5、位,但是很多人都误以为只有具有标题栏、状态栏、多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才最大化、最小化按钮这样标准的方框才叫窗口。叫窗口。n其实窗口的概念很广,例如按钮和对话其实窗口的概念很广,例如按钮和对话框等也是窗口哦,只不过是一种特殊的框等也是窗口哦,只不过是一种特殊的窗口罢了。窗口罢了。docin/sundae_meng第7页2、程序、程序n通常说的程序都是指一个能让计算机识别的文件通常说的程序都是指一个能让计算机识别的文件n接触得最多的是以接触得最多的是以exe或者或者com作为扩展名的文件。作为扩展名的文件。docin/sundae_meng第8页3、进
6、程、进程n进程就是应用程序的执行实例(或称一个执行程序),进程是程进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。序动态的描述。n一个以一个以exe作为扩展名的文件,在没有被执行的时候称之为应用作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。了。n当关机或者在任务栏的图标上单击鼠标右键选当关机或者在任务栏的图标上单击鼠标右键选“退出退出”时,进程时,进程便消亡,彻底结束了生命。便消亡,彻底结束了生命。n进程经历了由进程经历了由“创建创建”到到“消亡消亡”的生命
7、期,而程序自始至终存的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。在于你的硬盘上,不管计算机是否启动。docin/sundae_meng第9页4、线程、线程n线程是进程的一个执行单元,同一个进程中线程是进程的一个执行单元,同一个进程中的各个线程对应于一组的各个线程对应于一组CPU指令、一组指令、一组CPU寄存器以及一个堆栈。寄存器以及一个堆栈。n进程本来就具有动态的含义,是通过线程来进程本来就具有动态的含义,是通过线程来体现的。体现的。docin/sundae_meng第10页5、消息、消息n消息是应用程序和计算机交互的途径,在计消息是应用程序和计算机交互的途径,在计算机上几乎
8、做每一个动作都会产生一个消息算机上几乎做每一个动作都会产生一个消息n鼠标被移动会产生鼠标被移动会产生WM_MOUSEMOVE消消息,鼠标左键被按下会产生息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息,鼠标右键的消息,鼠标右键按下便产生按下便产生WM_RBUTTONDOWN消息等消息等等。等。docin/sundae_meng第11页事件事件句柄:句柄:n6、事件、事件n从字面意思就可以明白它的含义,如在程序运行从字面意思就可以明白它的含义,如在程序运行的过程中改变窗口的大小或者移动窗口等,都会的过程中改变窗口的大小或者移动窗口等,都会触发相应的触发相应的“事件事件”,从而调用相关的
9、事件处理,从而调用相关的事件处理函数。函数。n7、句柄:、句柄:n单单一个单单一个“柄柄”字便可以解释它的意思了,句柄字便可以解释它的意思了,句柄是一个指针,通过句柄就可以控制该句柄指向的是一个指针,通过句柄就可以控制该句柄指向的对象。编写程序总是要和各种句柄打交道的,句对象。编写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。象,用不同的句柄将他们区分开来。docin/sundae_meng第12页8、AP
10、I与与SDKnAPI是英文是英文ApplicationProgrammingInterface的的缩写,意思是缩写,意思是“应用程序接口应用程序接口”,泛指系统为应,泛指系统为应用程序提供的一系列函数接口。用程序提供的一系列函数接口。n在编程的时候可以直接调用,而不必知道其内部在编程的时候可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了。实现的过程,只知道它的原型和返回值就可以了。nSDK是英文是英文SoftwareDevelopmentKit的缩写,意的缩写,意思是思是“软件开发工具包软件开发工具包”,微软提供了许多专门,微软提供了许多专门的的SDK开发包,比如开发包
11、,比如DirectX开发包和语音识别开开发包和语音识别开发包等等。发包等等。docin/sundae_meng第13页学习学习Windows下编程下编程n学习语言,选择语言和工具是第一步,而且学习语言,选择语言和工具是第一步,而且是非常重要的一步工作,目前的编程语言那是非常重要的一步工作,目前的编程语言那么多,有么多,有C、C+、C#、Java和汇编语言等和汇编语言等等。等。n虽然有很多语言,只要精通一门就够了。从虽然有很多语言,只要精通一门就够了。从实用的角度来讲,实用的角度来讲,C/C+是最好的选择,而是最好的选择,而微软公司的微软公司的VisualC+和和Insprise公司(原公司(原
12、Borland公司)的公司)的C+Builder是其相应开发是其相应开发工具的两大主流。工具的两大主流。docin/sundae_meng第14页开发工具开发工具n在开发工具上,选择比较流行的在开发工具上,选择比较流行的VC+6.0,而且最好是英文版本,主界面如图而且最好是英文版本,主界面如图3-2所示。所示。docin/sundae_meng第15页学习编程需要经历三大步学习编程需要经历三大步n学习编程需要经历三大步:一、读程序;二、写程序;三、积累功能代码段。学习编程需要经历三大步:一、读程序;二、写程序;三、积累功能代码段。n1、读程序、读程序n在没有阅读过一份完整的源代码之前,别指望能
13、写出有多好的程序!读程序必在没有阅读过一份完整的源代码之前,别指望能写出有多好的程序!读程序必须具备一定的语言基础知识,基础知识主要是指语法知识,最起码要能读懂程须具备一定的语言基础知识,基础知识主要是指语法知识,最起码要能读懂程序的每一行意思。有没有程序的设计思想,在这个时期并不重要,只要具备一序的每一行意思。有没有程序的设计思想,在这个时期并不重要,只要具备一定的语法基础就可以了。定的语法基础就可以了。n学一门语言并不需要刻意去记条条框框的语法,看代码的时候,遇到了不明白学一门语言并不需要刻意去记条条框框的语法,看代码的时候,遇到了不明白的地方再去查相关的资料,补充基础知识再配合源程序的思
14、路,这时的理解才的地方再去查相关的资料,补充基础知识再配合源程序的思路,这时的理解才是最深刻的。是最深刻的。n2、写程序、写程序n刚开始写程序,不要奢望一下子写出很出色的程序来,刚开始写程序,不要奢望一下子写出很出色的程序来,“万丈高楼平底起万丈高楼平底起”,编程贵在动手,只要动手去写就可以了。此外,还要依照自身的能力循序渐进编程贵在动手,只要动手去写就可以了。此外,还要依照自身的能力循序渐进地写,开始的时候写一点功能简单的、篇幅短小的代码,力求简洁、完整,然地写,开始的时候写一点功能简单的、篇幅短小的代码,力求简洁、完整,然后在此基础上进行扩充,一点点的添加功能。后在此基础上进行扩充,一点点
15、的添加功能。n3、积累功能代码、积累功能代码n积累非常的重要,将平时自己写的和自己已经读通的程序分类保存起来,建一积累非常的重要,将平时自己写的和自己已经读通的程序分类保存起来,建一个属于自己的代码库,需要相关功能的时候,就到代码库中找相关的代码。这个属于自己的代码库,需要相关功能的时候,就到代码库中找相关的代码。这样既提高编码的效率又提高了正确率。样既提高编码的效率又提高了正确率。docin/sundae_meng第16页选择编程工具选择编程工具n目前流行两大语法体系:目前流行两大语法体系:Basic语系和语系和C语系。同一个语系。同一个语系下语言的基本语法是一样。两大语系如图语系下语言的基
16、本语法是一样。两大语系如图3-3所示。所示。nC语系中,目前两大语言如日中天:语系中,目前两大语言如日中天:C+和和Java。C+适宜做系适宜做系统软件的开发、统软件的开发、Java更适宜做网络应用开发。更适宜做网络应用开发。n虽然虽然VC+.NET已经面世很久了,但是已经面世很久了,但是C+的开发工具目前主流的开发工具目前主流依然是依然是VC+6.0和和C+Builder6.0。nJava流行的开发工具比较多,比如:流行的开发工具比较多,比如:IBM公司的公司的VisualAge和和WebsphereStudio,Insprise公司公司JBuilder等等。等等。docin/sundae_
17、meng第17页VC+6.0nVC+是基于是基于C/C+的集成开发工具,目前最常用的版本是的集成开发工具,目前最常用的版本是VC+6.0。VC+有一套集成开发工具,其中包括各种编辑器、编译工具、集成调有一套集成开发工具,其中包括各种编辑器、编译工具、集成调试器等等。在编写程序的过程中,各种操作都可以通过单击相应的菜单试器等等。在编写程序的过程中,各种操作都可以通过单击相应的菜单完成。完成。docin/sundae_meng第18页新建的是一个控制台程序新建的是一个控制台程序n可以看到许多工程类型,这里新建的是一个控制台程序,选可以看到许多工程类型,这里新建的是一个控制台程序,选择择“Win32
18、ConsoleApplication”,选择工程存放的路径,然,选择工程存放的路径,然后输入工程名后输入工程名“proj3_1”,然后点击按钮,然后点击按钮“OK”。出现的。出现的界面如图界面如图3-5所示。所示。n在图在图3-5的界面下选择创建工程的模板,选择空模板的界面下选择创建工程的模板,选择空模板“Anemptyproject”,点击按钮,点击按钮“Finish”,出现工程总结窗口,出现工程总结窗口,如图如图3-6所示所示。docin/sundae_meng第19页编程工具的使用编程工具的使用案例名称:编程工具的使用程序名称:proj3_1.cpp#includevoidmain()c
19、outHelloC+endl;ndocin/sundae_meng第20页编程工具的使用编程工具的使用n程序程序proj3_1.cpp代码包括三行代码包括三行n第一行:第一行:“#include”意思是引入意思是引入C+的基本的基本输入输出函数库,在输入输出函数库,在C语言中引入的是语言中引入的是“stdio.h”库。在库。在iostream.h文件中定义了文件中定义了cout的功能是输出,的功能是输出,endl的功能是的功能是回车换行。回车换行。n第二行:第二行:“voidmain()”,main()函数是函数是C/C+的主函数,的主函数,void表示该函数没有返回值。表示该函数没有返回值。
20、n第四行:第四行:“coutHelloC+endl;”,“cout”功能功能是向屏幕输出。是向屏幕输出。docin/sundae_meng第21页C语言发展的四个阶段语言发展的四个阶段nC语言经过不断的发展,在编程体系中可以语言经过不断的发展,在编程体系中可以将其分成四个阶段。将其分成四个阶段。n1、面向过程的、面向过程的C语言。语言。n2、面向对象的、面向对象的C+语言。语言。n3、SDK编程。编程。n4、MFC编程(编程(MicrosoftFoundationClass:微软基类库)。微软基类库)。docin/sundae_meng第22页面向过程的面向过程的C语言语言nC语言功能非常强大
21、,Linux/Unix操作系统就是用C语言写的,C语言直接调用操作系统提供的API函数可以编写非常前大的程序。nC和C+的最主要区别是:C语言中没有类的概念,C+在C的语法基础上引入了类(Class),所以C+和C的语法是基本相同的。面向过程编程,最基本的程序用C语言编写如proj3_2.cpp所示。n案例名称:使用C语言编程n程序名称:proj3_2.cppnn#includenmain()nnprintf(HelloDOSn);ndocin/sundae_meng第23页案例案例3-1读取命令行参数读取命令行参数main函数是程序的主函数,程序执行的时候先从函数是程序的主函数,程序执行的时
22、候先从main函数开始。函数开始。该函数可以带参数,第一个参数是该函数可以带参数,第一个参数是int型的,第二个参数是字符指针,具体使用方型的,第二个参数是字符指针,具体使用方法如法如proj3_3.cpp所示。所示。案例名称:读取命令行参数案例名称:读取命令行参数程序名称:程序名称:proj3_3.cpp#includeintmain(intargc,char*argv)inti;for(i=1;iargc;i+)printf(%sn,argvi);return0;docin/sundae_meng第24页面向对象的面向对象的C+语言语言n面向对象程序设计语言可以将一些变量和函数面向对象程序
23、设计语言可以将一些变量和函数封装到类(封装到类(Class)中,当变量被类封装后,)中,当变量被类封装后,称之为属性或者数据成员,当函数被类封装后,称之为属性或者数据成员,当函数被类封装后,称之为方法或者成员函数。称之为方法或者成员函数。n定义好的一个类,然后定义一个类的实例,这定义好的一个类,然后定义一个类的实例,这个实例就叫做对象,在个实例就叫做对象,在C+中可以用类定义对中可以用类定义对象,使用方法如程序象,使用方法如程序proj3_4.cpp所示。所示。docin/sundae_meng第25页在在C+中使用类中使用类案例名称:在案例名称:在C+中使用类中使用类程序名称:程序名称:pr
24、oj3_4.cpp#includeclasspersonpublic:intheart;char*name;intrun()/定义成员函数定义成员函数run()heart=heart+20;returnheart;docin/sundae_meng第26页voidmain()intiRunStop;personZhangSan;ZhangSan.name=张三张三;ZhangSan.heart=72;cout姓名姓名:ZhangSan.nameendl;cout跑步前心跳跑步前心跳ZhangSan.heartendl;/run()为对象的方法为对象的方法iRunStop=ZhangSan.ru
25、n();cout跑步后心跳跑步后心跳iRunStopendl;docin/sundae_meng第27页SDK编程编程nC库提供了许多函数,可以直接拿来使用。比如利用C库提供的DeleteFile函数来删除一个文件,如程序proj3_6.cpp所示。n案例名称:调用C库函数n程序名称:proj3_6.cppnn#includen#includenintmain()nnDeleteFile(C:test.txt);nprintf(删除成功删除成功n);nreturn0;ndocin/sundae_meng第28页编写窗口应用程序编写窗口应用程序n案例名称:编写对话框案例名称:编写对话框n程序名称
26、:程序名称:proj3_7.cppnn#includenintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,nPSTRszCmdLine,intiCmdShow)nnMessageBox(NULL,TEXT(Hello,Windows!),TEXT(HelloMsg),MB_OK);nreturn0;ndocin/sundae_meng第29页编写窗口应用程序编写窗口应用程序n参数一:参数一:hInstance是当前实例的句柄。句柄是是当前实例的句柄。句柄是windows编程极其重要编程极其重要的概念。它是一个整数,用于标识程序
27、、窗口和资源等。在这里的概念。它是一个整数,用于标识程序、窗口和资源等。在这里hInstance表示应用程序本身。表示应用程序本身。n参数二:参数二:hPrevInstance总是为总是为NULL,在,在Windows早期版本中,当多次早期版本中,当多次同时运行同一个程序时,系统会创建该程序的多个同时运行同一个程序时,系统会创建该程序的多个“实例实例”,同一程,同一程序的所有实例共享代码和内存。程序需要检查序的所有实例共享代码和内存。程序需要检查hPrevInstance来判断自来判断自身的其他实例是否正在运行,以便从已经存在的实例中获取数据。在身的其他实例是否正在运行,以便从已经存在的实例中
28、获取数据。在32位版本中,统一程序运行方式改变了,不在需要了!位版本中,统一程序运行方式改变了,不在需要了!n参数三:参数三:lpCmdLine是运行程序的命令行。用户可以单击是运行程序的命令行。用户可以单击”开始开始”菜单菜单中的中的”运行运行“选项,然后输入命令来运行一个程序,并且可以指定运选项,然后输入命令来运行一个程序,并且可以指定运行程序所需的参数,这里的命令由行程序所需的参数,这里的命令由lpCmdLine传入。传入。n参数四:参数四:nCmdShow用于指定程序窗口最初的显示模式,可以正常显用于指定程序窗口最初的显示模式,可以正常显示,也可以在初始化就最大化或者最小化。示,也可以
29、在初始化就最大化或者最小化。docin/sundae_meng第30页利用利用SDK函数创建窗口函数创建窗口#includeWNDCLASSwc;HWNDh_wnd;MSGmsg;/*消息处理函数消息处理函数wndProc的声明的声明*/longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain函数的声明函数的声明*/intPASCALWinMain(HINSTANCEh_CurInstance,HINSTANCEh_PrevInstance,LPSTRp_CmdLine,intm_Show)/*初始化初始化wndclass结构变量结构变量*
30、/wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;docin/sundae_meng第31页/*注册注册WndClass结构变量结构变量*/RegisterClass(&wc);/*创建窗口创建窗口*/h_wnd=CreateWindow(TheMainClass,OurfirstWindow,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_Cu
31、rInstance,0);/*显示窗口显示窗口*/ShowWindow(h_wnd,SW_SHOWMAXIMIZED);/*消息循环消息循环*/while(GetMessage(&msg,NULL,0,0)DispatchMessage(&msg);return(msg.wParam);/*定义消息处理函数定义消息处理函数*/longWINAPIWindowProc(HWNDh_wnd,UINTWinMsg,WPARAMw_param,LPARAMl_param)if(WinMsg=WM_DESTROY)PostQuitMessage(0);returnDefWindowProc(h_wnd,
32、WinMsg,w_param,l_param);docin/sundae_meng第32页MFC编程编程nSDK的功能非常强大,需要记很多的函数,的功能非常强大,需要记很多的函数,当面向对象编程成为主流的时候,微软将当面向对象编程成为主流的时候,微软将SDK的函数分类进行封装,这样就诞生了的函数分类进行封装,这样就诞生了MFC(MicrosoftFoundationClass)。)。nMFC程序的最基本的程序骨架如程序的最基本的程序骨架如proj3_9.cpp所示。所示。docin/sundae_meng第33页MFC编程编程#includeclasssample:publicCFrameWn
33、dpublic:sample()/构造函数构造函数Create(NULL,MyWindow);MessageBox(MyWindow,CFrameconstructor);classApp:publicCWinApppublic:BOOLInitInstance();BOOLExitInstance();docin/sundae_meng第34页/InitInstance函数的定义函数的定义/BOOLApp:InitInstance()MessageBox(0,MyWindow,InitInstance,MB_OK|MB_ICONASTERISK);sample*obj;obj=newsamp
34、le;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);returnTRUE;/ExitInstance函数定义函数定义BOOLApp:ExitInstance()MessageBox(0,MyWindow,ExitInstance,MB_OK|MB_ICONHAND);returnTRUE;/创建应用程序对象创建应用程序对象Appappobject;docin/sundae_meng第35页网络安全编程网络安全编程n网络安全基础编程技术主要包括网络安全基础编程技术主要包括6个方面:个方面:nSocket编程编程n注册表编程注册表编程n文件系统编程
35、文件系统编程n定时器编程定时器编程n驻留程序编程驻留程序编程n多线程编程。多线程编程。docin/sundae_meng第36页Socket编程编程n谈网络安全编程离开网络编程就会大失谈网络安全编程离开网络编程就会大失其味,凡是基于网络应用的程序都离不其味,凡是基于网络应用的程序都离不开开Socket。nSocket的意思是套接字,是计算机与计的意思是套接字,是计算机与计算机之间通信的接口。算机之间通信的接口。n使用使用Winsock提供的提供的API函数是最基本的函数是最基本的网络编程技术,程序网络编程技术,程序proj3_11.cpp利用利用Socket获得本机的获得本机的IP地址和机器名
36、。地址和机器名。docin/sundae_meng第37页Socket编程编程案案例名称:使用例名称:使用Socket得到得到IP地址地址程序名称:程序名称:proj3_11.cpp#include#includevoidCheckIP(void)/CheckIP函数,用于获取本机函数,用于获取本机IP地址地址WORDwVersionRequested;/WORD类型变量,用于存放类型变量,用于存放Winsock版本的值版本的值WSADATAwsaData;charname255;/用于存放主机名用于存放主机名PHOSTENThostinfo;wVersionRequested=MAKEWOR
37、D(2,0);/调用调用MAKEWORD()函数获得函数获得Winsock的版本,用于加载的版本,用于加载Winsock库库intmain()CheckIP();/调用调用CheckIP()函数获得并输出函数获得并输出IP地址地址return0;docin/sundae_meng第38页if(WSAStartup(wVersionRequested,&wsaData)=0)/加载加载Winsock库,如果库,如果WSAStartup()函数的返回值为函数的返回值为0,说明加载成功,说明加载成功if(gethostname(name,sizeof(name)=0)/判断是否成功的将本地主机名存放
38、入由判断是否成功的将本地主机名存放入由name参数指定的缓冲区中参数指定的缓冲区中if(hostinfo=gethostbyname(name)!=NULL)/如果获得主机名成功的话,调用如果获得主机名成功的话,调用inet_ntoa()函数取得函数取得IP地址地址LPCSTRip=inet_ntoa(*(structin_addr*)*hostinfo-h_addr_list);printf(本机的本机的IP地址是:地址是:%sn,ip);/输出输出IP地址地址printf(本机的名称是:本机的名称是:%sn,name);WSACleanup();/卸载卸载Winsock库,并释放所有资源库
39、,并释放所有资源docin/sundae_meng第39页注册表编程注册表编程n注册表在计算机中由键名和键值组成,注册表中存储了注册表在计算机中由键名和键值组成,注册表中存储了Window操作系统的所有配置。黑客操作系统的所有配置。黑客90%以上对以上对Windows的攻击手段都离不开读写注册表。的攻击手段都离不开读写注册表。n在运行窗口中输入在运行窗口中输入“regedit”命令可以进入注册表,注册命令可以进入注册表,注册表的界面如图表的界面如图3-37所示。所示。docin/sundae_meng第40页注册表编程注册表编程n注册表的句柄可以由调用注册表的句柄可以由调用RegOpenKey
40、Ex()和和RegCreateKeyEx()函数得函数得到的,通过函数到的,通过函数RegQueryValueEx()可以查询注册表某一项的值可以查询注册表某一项的值n通过函数通过函数RegSetValueEx()可以设置注册表某一项的值。可以设置注册表某一项的值。RegCreateKeyEx()函数和函数和RegSetValueEx()函数的使用方法如程序函数的使用方法如程序proj3_12.cpp所示。所示。docin/sundae_meng第41页操作注册表操作注册表n#include#includemain()HKEYhKey1;DWORDdwDisposition;LONGlRetC
41、ode;/创建创建lRetCode=RegCreateKeyEx(HKEY_LOCAL_MACHINE,SOFTWAREMicrosoftWindowsNTCurrentVersionIniFileMappingWebSecurity,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey1,&dwDisposition);/如果创建失败,显示出错信息如果创建失败,显示出错信息if(lRetCode!=ERROR_SUCCESS)printf(ErrorincreatingWebSecuritykeyn);return(0);docin/sund
42、ae_meng第42页/设置第一个键值设置第一个键值lRetCode=RegSetValueEx(hKey1,Hack_Name,0,REG_SZ,(byte*)sixage,100);/设置第二个键值设置第二个键值lRetCode=RegSetValueEx(hKey1,Hack_Hobby,0,REG_SZ,(byte*)Running,100);/如果创建失败,显示出错信息如果创建失败,显示出错信息if(lRetCode!=ERROR_SUCCESS)printf(ErrorinsettingSection1valuen);return(0);printf(注册表编写成功!注册表编写成功
43、!n);return(0);docin/sundae_meng第43页判断是否中了判断是否中了“冰河冰河”n中了中了“冰河冰河”的计算机注册表都将被修改了,修改了扩展名的计算机注册表都将被修改了,修改了扩展名为为txt的文件的打开方式,在注册表中的文件的打开方式,在注册表中txt文件的打开方式定文件的打开方式定义在义在HKEY_CLASSES_ROOT主键下的主键下的“txtfileshellopencommand”中,如图中,如图3-40所示。所示。docin/sundae_meng第44页案例案例3-6更改登录用户名更改登录用户名n当用户登录系统以后,注册表中就会自动记下用户名,当用户登录
44、系统以后,注册表中就会自动记下用户名,下次登录时再把登录名显示出来,如图下次登录时再把登录名显示出来,如图3-42所示。所示。docin/sundae_meng第45页案例案例3-6更改登录用户名更改登录用户名n当非法入侵计算机以后,同样会留下非法登录的用户名,所以需当非法入侵计算机以后,同样会留下非法登录的用户名,所以需要将用户名修改会原来的值。要将用户名修改会原来的值。n该用户名记录在注册表的该用户名记录在注册表的HKEY_LOCAL_MACHINE主键下的主键下的SOFTWAREMicrosoftWindowsNTCurrentVersionWinlogon子键中,键的名称是:子键中,键
45、的名称是:DefaultUserName,如图,如图3-43所示。所示。docin/sundae_meng第46页更改系统登录用户更改系统登录用户案例名称:更改系统登录用户案例名称:更改系统登录用户程序名称:程序名称:proj3_14.cpp#include#includemain()HKEYhKey1;LONGlRetCode;lRetCode=RegOpenKeyEx(HKEY_LOCAL_MACHINE,SOFTWAREMicrosoftWindowsNTCurrentVersionWinlogon,0,KEY_WRITE,&hKey1);if(lRetCode!=ERROR_SUCCE
46、SS)printf(Errorincreatingappname.inikeyn);return(0);docin/sundae_meng第47页lRetCode=RegSetValueEx(hKey1,DefaultUserName,0,REG_SZ,(byte*)Hacker_sixage,20);if(lRetCode!=ERROR_SUCCESS)printf(ErrorinsettingSection1valuen);return(0);printf(已经将登录名该成Hacker_sixage);return(0);docin/sundae_meng第48页文件系统编程文件系统编程n
47、文件系统编程非常的重要,可以在文件系统编程非常的重要,可以在DOS命令行下执行的操命令行下执行的操作都可以使用程序实现。作都可以使用程序实现。在在DOS命令行下使用命令命令行下使用命令“netuserHacker/add”添加一个用添加一个用户,同样可以在程序中实现,如程序户,同样可以在程序中实现,如程序proj3_15.cpp所示。所示。案例名称:添加系统用户案例名称:添加系统用户程序名称:程序名称:proj3_15.cppdocin/sundae_meng第49页#include#includemain()char*szCMD=netuserHacker/add;BOOLbSuccess;
48、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(创建进程失败!创建进程失败!);return
49、1;docin/sundae_meng第50页文件拷贝和移动文件拷贝和移动案例名称:文件拷贝和移动案例名称:文件拷贝和移动程序名称:程序名称:proj3_16.cpp#include#includemain()CopyFile(C:File1.txt,C:File2.txt,TRUE);MoveFile(C:File1.txt,C:File3.txt);return1;docin/sundae_meng第51页系统时间系统时间案例名称:系统时间案例名称:系统时间程序名称:程序名称:proj3_17.cpp#include#includemain()SYSTEMTIMEsysTime;GetLo
50、calTime(&sysTime);printf(%d年年%d月月%d日日%d时时%d分分%d秒秒n,sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);return1;docin/sundae_meng第52页定时器编程定时器编程n著名的著名的“CIH病毒病毒”每年定时发作,其中每年定时发作,其中需要利用定时器来控制程序的执行。定需要利用定时器来控制程序的执行。定时器程序分成两大类,时器程序分成两大类,n一类是循环执行一类是循环执行n另一类是根据条件只执行一次。在程序