[精选]第3课-网络安全基础编程-PowerPointPres6843

上传人:无*** 文档编号:158023172 上传时间:2022-10-02 格式:PPTX 页数:108 大小:1.04MB
收藏 版权申诉 举报 下载
[精选]第3课-网络安全基础编程-PowerPointPres6843_第1页
第1页 / 共108页
[精选]第3课-网络安全基础编程-PowerPointPres6843_第2页
第2页 / 共108页
[精选]第3课-网络安全基础编程-PowerPointPres6843_第3页
第3页 / 共108页
资源描述:

《[精选]第3课-网络安全基础编程-PowerPointPres6843》由会员分享,可在线阅读,更多相关《[精选]第3课-网络安全基础编程-PowerPointPres6843(108页珍藏版)》请在装配图网上搜索。

1、第三章 网络安全编程基础*内容提要Windows的内部机制C语言的四个发展阶段实现Socket编程、注册表编程、定时器编程驻留程序编程和多线程编程。3.1 网络安全编程概述 C语言可以在Windows下编程,同样也可以在Linux下编程。编程是一项比较综合的工作,除了熟练使用编程工具以外,还要了解系统本身的内部工作机理和编程语言。3.1.1 Windows内部机制 Windows是一个“基于事件的,消息驱动的”操作系统。用户进行了影响窗口的动作触发“事件”系统检测到后发给应用程序“消息”处理*八个基本概念与Windows系统密切相关的八个基本概念分别是:l窗口、程序、进程、线程l消息、事件、句

2、柄、API与SDK。*窗 口窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位窗口是显示在屏幕上的一个矩形区域l具有标题栏、状态栏、最大化、最小化按钮的标准方框叫窗口,按钮也是特殊窗口l是用户与生成该窗口的应用程序间的直观接口窗口是受应用程序控制的一部分矩形屏幕区l控制窗口的大小、风格、位置及内容用户角度应用程序角度*程 序通常说的程序都是指一个能让计算机识别的文件接触得最多的是以exe或者com作为扩展名的文件。程序一组指令的集合l例如:QQ程序,主要包括l 界面外观控制指令集l socket网络通讯指令集l 数据信息存储指令集可以任何语言形式表现:高级语言、汇编语言

3、、机器语言*进 程进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。l一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。l当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。查看当前进程如下图*查看当前进程*线 程线程是进程的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。可以从下载工具看出来l原来的下载工具是单进程单线程l目前的下载工具是单进程多线

4、程*消 息消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息鼠标被移动会产生WM_MOUSEMOVE消息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息鼠标右键按下便产生WM_RBUTTONDOWN消息*事件、句柄事件l如在程序运行的过程中改变窗口的大小或者移动窗口等,都会触发相应的“事件”,从而调用相关的事件处理函数。l例如:BUTTONCLICK事件,触发ONBUTTON CLICK()事件处理函数句柄l句柄是一个指针,通过句柄就可以控制该句柄指向的对象。l编写程序总是要和各种句柄打交道的l句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系

5、统中被视为不同类型的对象,用不同的句柄将他们区分开来。l例如:HWND、HDC、HBRUSH、HMENU、HPEN等等*API与SDKAPI是系统为应用程序提供的一系列函数接口。l英文Application Programming Interface 的缩写,意思是“应用程序接口”,SDK是英文Software Development Kit的缩写,意思是“软件开发工具包”,l微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等等。3.1.2 学习Windows下编程学习语言,选择语言和工具是第一步l目前的编程语言有C、C+、C#、Java和汇编语言等等。从实用的角度来

6、讲,C/C+是最好的选择,微软公司的Visual C+是其相应开发工具*开发工具在开发工具上,选择比较流行的VC+6.0,而且最好是英文版本,主界面如图所示*学习编程需要经历三大步1、读程序l在没有阅读过一份完整的源代码之前,别指望能写出有多好的程序!2、写程序l“万丈高楼平底起”,编程贵在动手,只要动手去写就可以了。l还要依照自身的能力循序渐进地写3、积累功能代码l将平时自己写的和自己已经读通的程序分类保存起来,建一个属于自己的代码库3.1.3 选择编程工具 目前流行两大语法体系:Basic语系和C语系。同一个语系下语言的基本语法是一样。两大语系如图所示。C语系中,目前两大语言如日中天:C+

7、和Java。lC+适宜做系统软件的开发、Java更适宜做网络应用开发。l虽然VC+.NET已经面世很久了,但是C+的开发工具目前主流依然是VC+6.0和C+Builder6.0。lJava流行的开发工具比较多,比如:IBM公司的Visual Age和Websphere Studio、Eclipse,Insprise公司JBuilder等等。C语系:C语言/C+语言/Java语言/Perl语言/C#/JavaScriptBasic语系:Basic语言/VB6.0/VB.NET/VBScript/VBA*VC+6.0目前最常用的版本是VC+6.0。VC+有一套集成开发工具,其中包括各种编辑器、编译

8、工具、集成调试器等等下面通过一个程序来说明开发工具使用:File-New选择project,输入各项值,如图:新建的是一个控制台程序在左图的界面下选择创建工程的模板,选择空模板“An empty project”,点击按钮“Finish”,出现工程总结窗口,如右图所示。为工程新加一个程序文件:File-New-FILES选择C+Source File,取名,后进入下面界面选择 BUILD-Execute执行程序,出现结果*说明说明程序proj3_1.cpp代码包括三行第一行:“#include”意思是引入C+的基本输入输出函数库,在C语言中引入的是“stdio.h”库。在iostream.h文

9、件中定义了cout的功能是输出,endl的功能是回车换行。第二行:“void main()”,main()函数是C/C+的主函数,void表示该函数没有返回值。第四行:“cout Hello C+endl;”,“cout”功能是向屏幕输出。3.2 C语言发展的四个阶段 C语言经过不断的发展,在编程体系中可以将其分成四个阶段。l1、面向过程的C语言。l2、面向对象的C+语言。l3、SDK编程。l4、MFC编程(Microsoft Foundation Class:微软基类库)。3.2.1 面向过程的C语言 C语言功能非常强大lLinux/Unix操作系统就是用C语言写的,C语言直接调用操作系统提

10、供的API函数可以编写非常强大的程序。C和C+的最主要区别是:C语言中没有类的概念,C+在C的语法基础上引入了类(Class)。面向过程编程,最基本的程序用C语言编写如proj3_2.cpp所示。案例名称:使用案例名称:使用C语言编程语言编程程序名称:程序名称:proj3_2.cpp#include main()printf(Hello DOSn);*案例3-1 读取命令行参数案例名称:读取命令行参数程序名称:proj3_3.cpp#include int main(int argc,char*argv)int i;for(i=1;i argc;i+)printf(%sn,argvi);ret

11、urn 0;参数个数参数的值编译后在命令行下运行如下3.2.2 面向对象的C+语言面向对象程序设计语言可以将一些变量和函数封装到类(Class)中l当变量被类封装后,称之为属性或者数据成员l当函数被类封装后,称之为方法或者成员函数定义好的一个类,然后定义一个类的实例,这个实例就叫做对象,在C+中可以用类定义对象,使用方法如程序proj3_4.cpp所示。类属性方法*在在C+C+中定义类中定义类案例名称:在C+中使用类程序名称:proj3_4.cpp#include person public:int heart;char*name;int run()/定义成员函数run()heart=hear

12、t+20;return heart;定义person类属性方法private、protected*在在C+C+中使用类中使用类void main()int iRunStop;.name=张三;.heart=72;cout姓名:.name endl;cout跑步前心跳.heart endl;/run()为对象的方法iRunStop=.run();cout跑步后心跳iRunStopendl;编译运行输出结果如图*将类定义与实现分离类的定义放在.h文件中,实现放在.cpp文件中,具体如proj3_5所示在proj3_5.h中有 person public:int heart;char*name;in

13、t run();*将类定义与实现分离在proj3_5.cpp中有#include#include“proj3_5.h”int person:run()heart=heart+20;return heart;void main()int iRunStop;.name=张三;.heart=72;cout姓名:.name endl;cout跑步前心跳.heart endl;iRunStop=.run();cout跑步后心跳iRunStopendl;3.2.3 SDK编程C库提供了许多函数,可以直接拿来使用。比如利用C库提供的DeleteFile函数来删除一个文件,如程序proj3_6.cpp所示。案

14、例名称:调用C库函数程序名称:proj3_6.cpp#include#include int main()DeleteFile(C:test.txt);printf(删除成功n);return 0;执行结果如右图C库函数提供*编写窗口应用程序编写对话框的语法如下面程序案例名称:编写对话框程序名称:proj3_7.cpp#include int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)MessageBox(NULL,TEXT(Hello,Windows!),TEX

15、T(HelloMsg),MB_OK);return 0;编译执行结果如图*编写窗口应用程序工程类型要改为WIN32 Application,如图lWIN32 Console Application主函数为main()lWIN32 Application主函数为WinMain()*编写窗口应用程序WinMain(HINSTANCE hInstance,HINSTANCE,PSTR,int iCmdShow)参数一:hInstance 是当前实例的句柄。在这里hInstance表示应用程序本身。参数二:总是为NULL,在Windows早期版本中使用,在32位版本中,统一程序运行方式改变了,不在需要

16、了!参数三:是运行程序的命令行参数四:iCmdShow用于指定程序窗口最初的显示模式,可以正常显示,也可以在初始化就最大化或者最小化。案例3-2 利用SDK函数创建窗口 程序名称:proj3_8.cpp#include WNDCLASS wc;HWND h_wnd;MSG msg;/*消息处理函数wndProc的声明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);窗口对象窗口句柄Windows消息对象案例3-2 利用SDK函数创建窗口/*winMain 函数的声明*/int PASCAL WinMain(HINSTANCE h_CurInst

17、ance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show)/*初始化wndclass结构变量*/wc.lpfnWndProc=;wc.hInstance=h_CurInstance;wc.=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;/*注册WndClass结构变量*/RegisterClass(&wc);案例3-2 利用SDK函数创建窗口/*创建窗口*/h_wnd=CreateWindow(TheMainClass,Our first Window,

18、WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0);ShowWindow(h_wnd,SW_SHOWMAXIMIZED);/*消息循环消息循环*/while(GetMessage(&msg,NULL,0,0)DispatchMessage(&msg);return(msg.wParam);注册的窗口名窗口标题窗口样式窗口左上角的位置窗口宽度与高度程序当前句柄将消息发送给Windowproc案例3-2 利用SDK函数创建窗口/*定义消息处理函数*/long WINAPI WindowProc(HWND h_wnd,UINT WinMsg,WP

19、ARAM w_param,LPARAM l_param)if(WinMsg=)PostQuitMessage(0);return DefWindowProc(h_wnd,WinMsg,w_param,l_param);执行结果如右图3.2.4 MFC编程 SDK的功能非常强大,需要记很多的函数微软将SDK的函数分类进行封装,这样就诞生了MFC(Microsoft Foundation Class)。MFC程序的最基本的程序骨架如proj3_9.cpp所示。3.2.4 MFC编程#includeclass:public CFrameWndpublic:sample()/构造函数Create(NU

20、LL,My Window);MessageBox(My Window,);class App:public CWinApppublic:BOOL InitInstance();BOOL ExitInstance();类继承3.2.4 MFC编程/InitInstance函数的定义/BOOL App:InitInstance()MessageBox(0,My Window,MB_OK|MB_ICONASTERISK);sample*obj;obj=new sample;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);return TRUE;/Exi

21、tInstance函数定义BOOL App:ExitInstance()MessageBox(0,My Window,MB_OK|MB_ICONHAND);return TRUE;/创建应用程序对象3.2.4 MFC编程如果配置的执行方式与前面一样,则会出错3.2.4 MFC编程两种解决办法l新建工程时选择 MFC AppWizard(exe)l在原来基础上,project-setting设置中修改,如图3.2.4 MFC编程程序首先执行最一行:InitInstance()执行第一句 MessageBox(0,My Window,MB_OK|MB_ICONASTERISK);3.2.4 MFC

22、编程接着程序执行 sample*obj;obj=new sample;当Sample类对象实例化时自动调用构造函数 sample()/构造函数Create(NULL,My Window);MessageBox(My Window,);弹出对话框3.2.4 MFC编程接着程序执行m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);显示主窗口(最大化)3.2.4 MFC编程当退出主窗口时,系统自动调用ExitInstance()执行MessageBox(0,My Window,MB_OK|MB_ICONHAND);弹出窗口如右图案例3-3 MFC的事件处

23、理机制#includeclass:public CFrameWndpublic:sample()/构造函数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_MESSAGE_MAP();案例3-3 MFC的事件处

24、理机制(sample,CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()()class App:public CWinApppublic:BOOL InitInstance();BOOL ExitInstance();/InitInstance函数的定义/BOOL App:InitInstance()sample*obj;obj=new sample;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);return TRUE;案例3-3 MFC的事件处理机制/ExitInstance函数定义BOOL Ap

25、p:ExitInstance()return TRUE;/创建应用程序对象编译运行会在按下左键,右键时弹出对话框3.3 网络安全编程 网络安全基础编程技术主要包括6个方面:lSocket编程l注册表编程l文件系统编程l定时器编程l驻留程序编程l多线程编程。3.3.1 Socket编程谈网络安全编程离开网络编程就会大失其味,凡是基于网络应用的程序都离不开Socket。Socket的意思是套接字,是计算机与计算机之间通信的接口。Socket网络编程一般采用服务器/客户机模式,有两种不同的套接字l流套接字l数据报套接字流套接字的编程时序图如下服务器 客户机 Socket()bind()listen(

26、)accept()read()write()close()Socket()connect()read()write()close()连接请求数据请求应答数据数据报套接字的编程时序图如下服务器 客户机 Socket()bind()readfrom()sendto()close()Socket()bind()readfrom()sendto()close()服务请求服务应答3.3.1 Socket编程使用Winsock提供的API函数是最基本的网络编程技术程序proj3_11.cpp利用Socket获得本机的IP地址和机器名附加:利用socket编程实现扫描网站端口3.3.1 Socket编程案例

27、名称:使用Socket得到IP地址程序名称:proj3_11.cpp#include#include void CheckIP(void)/CheckIP函数,用于获取本机IP地址 WORD wVersionRequested;/用于存放Winsock版本的值 WSADATA wsaData;char name255;/用于存放主机名PHOSTENT hostinfo;wVersionRequested=MAKEWORD(2,0);/调用MAKEWORD()函数获得Winsock的版本,用于加载Winsock库3.3.1 Socket编程 if(WSAStartup(wVersionReque

28、sted,&wsaData)=0)/加载Winsock库,如果WSAStartup()函数的返回值为0,说明加载成功if(gethostname(name,sizeof(name)=0)/判断是否成功的将本地主机名存放入由name参数指定的缓冲区中 if(hostinfo=gethostbyname(name)!=NULL)/如果获得主机名成功的话,调用inet_ntoa()函数取得IP地址 LPCSTR ip=inet_ntoa(*(struct in_addr*)*hostinfo-h_addr_list);printf(本机的IP地址是:%sn,ip);/输出IP地址 printf(本机

29、的名称是:%sn,name);WSACleanup();/卸载Winsock库,并释放所有资源 int main()CheckIP();/调用CheckIP()函数获得并输出IP地址return 0;3.3.1 Socket编程由于采用main()函数,所以工程采用“WIn32 Console Application”编译执行,出现错误,如图3.3.1 Socket编程消除错误的方法是在project-settings-link-Object/library modules,加入“WS_32.lib”3.3.1 Socket编程再编译执行就可得到*利用Socket实现简单扫描器程序清单如下:#

30、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实现简单扫描器for(int i=1;i200;i+)lRESULT=WSAStartup(0 x0101,&ws);s=socket(PF_INET,SOCK_STREAM,0);addr.sin_family=PF_INET;addr.sin_addr.s_addr=inet_a

31、ddr(“162.105.195.158”);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.158:%i inactiven”,i);WSACleanup();else printf(“162.105.195.158:%i activen”,i);Closesocket(s);这样可以实现对某一网站的端口扫描建立连接3.3.2 注册表编程 注

32、册表在计算机中由键名和键值组成,注册表中存储了Window操作系统的所有配置。黑客90%以上对Windows的攻击手段都离不开读写注册表。在运行窗口中输入“regedit”命令可以进入注册表,注册表的界面如图所示。3.3.2 注册表编程注册表的句柄可以由调用RegOpenKeyEx()和RegCreateKeyEx()函数得到的通过函数RegQueryValueEx()可以查询注册表某一项的值;通过函数RegSetValueEx()可以设置注册表某一项的值RegCreateKeyEx()函数和RegSetValueEx()函数的使用方法如程序proj3_12.cpp所示案例名称:操作注册表案例

33、名称:操作注册表#include#include main()hKey1;DWORD dwDisposition;LONG lRetCode;/创建 lRetCode=(HKEY_LOCAL_MACHINE,SOFTWAREMicrosoftWindows NTCurrentVersionIniFileMappingWebSecurity,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey1,&dwDisposition);/如果创建失败,显示出错信息 if(lRetCode!=ERROR_SUCCESS)printf(Error in cr

34、eating WebSecurity keyn);return(0);/设置第一个键值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(Error in setting Section1 valuen);return(0);printf(注册表编写成功!n);re

35、turn(0);编译运行结果:*判断是否中了“冰河”中了“冰河”的计算机注册表都将被修改了,修改了扩展名为txt的文件的打开方式,在注册表中txt文件的打开方式定义在HKEY_CLASSES_ROOT主键下的“txtfileshellopencommand”中,如图所示。*判断是否中了判断是否中了“冰河冰河”案例名称:判断是否中了“冰河”程序名称:proj3_13.cpp#include#include main()HKEY hKEY;LPCTSTR data_Set=txtfileshellopencommand;long ret0=(RegOpenKeyEx(HKEY_CLASSES_RO

36、OT,data_Set,0,KEY_READ,&hKEY);if(ret0!=ERROR_SUCCESS)/如果无法打开hKEY,则终止程序的执行 return 0;*判断是否中了判断是否中了“冰河冰河”/查询有关的数据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

37、 char*)owner_Get,)=0)printf(没有中冰河);elseprintf(可能中了冰河);printf(n);键名为默认(看注册表)编译执行结果:*案例3-6 更改登录用户名 当用户登录系统以后,注册表中就会自动记下用户名,下次登录时再把登录名显示出来,如图所示。案例3-6 更改登录用户名当非法入侵计算机以后,同样会留下非法登录的用户名,所以需要将用户名修改回原来的值。该用户名记录在注册表的HKEY_LOCAL_MACHINE主键下的SOFTWAREMicrosoftWindows NTCurrentVersionWinlogon子键中,键的名称是:DefaultUserNa

38、me,如图所示。*程序更改系统登录用户程序更改系统登录用户案例名称:更改系统登录用户程序名称:proj3_14.cpp#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);lR

39、etCode=RegSetValueEx(hKey1,DefaultUserName,0,REG_SZ,(byte*)Hacker_sixage,20);if(lRetCode!=ERROR_SUCCESS)printf(Error in setting Section1 valuen);return(0);printf(已经将登录名该成Hacker_sixage);return(0);编译执行当我们重启时,登录界面为3.3.3 文件系统编程文件系统编程非常的重要,可以在DOS命令行下执行的操作都可以使用程序实现。在DOS命令行下使用命令“net user Hacker/add”添加一个用户,

40、同样可以在程序中实现,如程序proj3_15.cpp所示编译执行后可看到,已经添加用户HACKER源代码如下页#include#include main()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=CreateProcess(NULL,NULL

41、,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);if(!bSuccess)printf(创建进程失败!);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;编译执行后看到新的文件原有文件如果已存在file2.txt,则覆盖重命名*系统时间系统时间案例名称:系统时间程序名称:proj3_17

42、.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;编译执行,如图3.3.4 定时器编程 著名的“CIH病毒”每年定时发作,其中需要利用定时器来控制程序的执行。定时器程序分成两大类,l一类是循环执行l另一类是根据条件只执行一次。在程序中加载定时器,如程序proj3

43、_18所示。3.3.4 定时器编程定时器编程案例名称:定时器编程程序名称:proj3_18.cpp#include WNDCLASS wc;HWND h_wnd;MSG msg;/*消息处理函数wndProc的声明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain 函数的声明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show)3.3.4定时器编程定时器编程/*初始化wndclass结构变

44、量*/wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;/*注册WndClass结构变量*/RegisterClass(&wc);/*创建窗口*/h_wnd=CreateWindow(TheMainClass,Our first Window,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0);/*显示窗口*/ShowWi

45、ndow(h_wnd,SW_SHOWMAXIMIZED);/*消息循环*/while(GetMessage(&msg,NULL,0,0)DispatchMessage(&msg);return(msg.wParam);3.3.4定时器编程定时器编程#define ID_TIMER 1/*定义消息处理函数*/long WINAPI WindowProc(HWND h_wnd,UINT WinMsg,WPARAM w_param,LPARAM l_param)static BOOL fFlipFlop=FALSE;HBRUSH hBrush;HDC hdc;PAINTSTRUCT ps;RECT

46、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,&rc);hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(

47、0,0,255);设置定时器触发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_param);编译执行出现红蓝交替显示窗口取消定时器3.3.5 驻留程序编程 一般程序运行时都有窗口一般后门或病毒程序是后台运行的(即驻留程序)其实编写驻留程序

48、很方便,在上述 proj3_18.cpp中将ShowWindow()函数的“SW_SHOWMAXMIZED”改为“SW_HIDE”即可。可参看proj3_19.cpp中 ShowWindow(h_wnd,SW_HIDE);3.3.5 驻留程序编程编译执行没有任何显示,打开任务管理器,可以看到proj3_19.exe正在运行3.3.5 驻留程序编程程序运行时不显示界面,为了实现自动驻留,一般有两种方法l更改l让该程序与用户的某一操作关联比如:“冰河”木马采用第二种方法l当用户双击扩展名为txt的文本文件时,自动加载“冰河”程序案例3-7“冰河”原型 第一种方法实现起来比较简单,注册表的自启动项的

49、键值在“HKEY_LOCAL_MACHINE”主键下的“SOFTWAREMicrosoftWindowsCurrentVersion Run”子键中,如图所示(可手工可程序添加)案例3-7“冰河”原型第二种方法的实现是使用“HKEY_CLASSES_ROOT”主键下“txtfileshellopencommand”键程序实现的是:当用户双击打开一个文本文件时,先启动要驻留的程序,然后再启动记事本打开这个文本文件。:用户双击的文本文件地址如何通过驻留程序传递给记事本。案例3-7“冰河”原型第一步,先修改注册表关联(可手工可程序)l在“HKEY_CLASSES_ROOT”主键下“txtfilesh

50、ellopencommand”键值改为驻留程序(e:proj3_20.exe%1)第二步就是实现关键部分,实现方法如proj3_20.cpp程序案例3-7“冰河”原型proj3_20.cpp源程序如下:#include WNDCLASS wc;HWND h_wnd;MSG msg;/*消息处理函数wndProc的声明*/long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain 函数的声明*/int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR

51、p_CmdLine,int m_Show)案例3-7“冰河”原型BOOL bSuccess;piProcInfo;Info;Info.cb=sizeof(STARTUPINFO);Info.lpReserved=NULL;Info.lpDesktop=NULL;Info.lpTitle=NULL;Info.cbReserved2=0;Info.lpReserved2=NULL;char lpAppName100;strcpy(lpAppName,notepad.exe);建立一个可以执行DOS命令的对象案例3-7“冰河”原型if(strcmp(p_CmdLine,)!=0)strcat(lpA

52、ppName,p_CmdLine);bSuccess=CreateProcess(NULL,lpAppName,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo);/*初始化wndclass结构变量*/wc.lpfnWndProc=WindowProc;wc.hInstance=h_CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=TheMainClass;实现记事本打开文件以下就是自己驻留程序的功能实现案例3-7“冰河”原型/*注册

53、WndClass结构变量*/RegisterClass(&wc);/*创建窗口*/h_wnd=CreateWindow(TheMainClass,Our first Window,WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0);/*显示窗口*/ShowWindow(h_wnd,SW_HIDE);/*消息循环*/while(GetMessage(&msg,NULL,0,0)DispatchMessage(&msg);return(msg.wParam);案例3-7“冰河”原型/*定义消息处理函数*/long WINAPI WindowPr

54、oc(HWND h_wnd,UINT WinMsg,WPARAM w_param,LPARAM l_param)switch(WinMsg)case WM_DESTROY:PostQuitMessage(0);return 0;return DefWindowProc(h_wnd,WinMsg,w_param,l_param);3.3.6 多线程编程 用多线程技术编程有两大优点:l1、提高CPU的利用率l2、采用多线程技术,可以设置每个线程的优先级,调整工作的进度。在实际开发过程中,一定要有一个主进程,其他线程可以共享该进程也可以独立运行,每个线程占用CPU的时间有限制,可以设置运行优先级别。

55、*独立线程程序的编写独立线程程序的编写案例名称:独立线程程序的编写程序名称:proj3_21.cpp#include#include#include int addem(int);int main(int argc,char*argv)_beginthread(void(*)(void*)addem,0,(void*)10);_beginthread(void(*)(void*)addem,0,(void*)11);addem(12);return 0;*独立线程程序的编写独立线程程序的编写int addem(int count)inti;long sum;sum=0;for(i=0;i=co

56、unt;+i)printf(The value of%d is%dn,count,i);sum+=i;printf(The sum is%dn,sum);return 0;*独立线程程序的编写独立线程程序的编写编译执行,出错*独立线程程序的编写独立线程程序的编写由于基于控制台程序默认单线程执行,所以修改*独立线程程序的编写独立线程程序的编写再编译执行得到如下结果*多个线程共享参数多个线程共享参数案例名称:多个线程共享参数程序名称:proj3_22.cpp#include#include#include int addem(int);int x;/全局变量 int main(int argc,c

57、har*argv)x=0;_beginthread(void(*)(void*)addem,0,(void*)1);_beginthread(void(*)(void*)addem,0,(void*)2);addem(3);return 0;*多个线程共享参数多个线程共享参数int addem(int index)while(x=50)x=x+1;printf(%d:%dn,index,x);return 0;本章总结本章需要重点掌握Windows操作系统的内部机制,理解C语言四个阶段编程的特点。重点掌握网络安全编程领域的Socket编程、注册表编程、驻留程序的编程和多线程编程。本章习题【1】、简述Windows操作系统的内部机制。【2】、简述学习Windows下编程的注意点。【3】、比较C语言四个发展阶段编程的特点。【4】、用程序说明MFC的事件处理机制。【5】、编写程序实现功能:清除“冰河”程序和文本文件的关联。(上机完成)【6】、编写程序实现功能:在每天夜里十二点,自动删除C盘下的File4.txt文件。(上机完成)【7】、编写程序实现功能:当登录系统以后,自动执行一个程序,该程序将系统登录名改成Administrator。(上机完成)【8】、编写程序实现功能:当用户用鼠标双击一个文本文件的时候,自动删除该文件。(上机完成)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!