世上最完整的病毒分析及实例

上传人:pu****.1 文档编号:431868874 上传时间:2023-10-17 格式:DOC 页数:114 大小:379KB
返回 下载 相关 举报
世上最完整的病毒分析及实例_第1页
第1页 / 共114页
世上最完整的病毒分析及实例_第2页
第2页 / 共114页
世上最完整的病毒分析及实例_第3页
第3页 / 共114页
世上最完整的病毒分析及实例_第4页
第4页 / 共114页
世上最完整的病毒分析及实例_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《世上最完整的病毒分析及实例》由会员分享,可在线阅读,更多相关《世上最完整的病毒分析及实例(114页珍藏版)》请在金锄头文库上搜索。

1、 .wd.第3章 病毒分析本章介绍病毒的原理与所使用的技术,以及防止病毒的方法: 常见病毒的原理; 可执行文件病毒修改文件的方法; 可执行文件病毒使用的常用技术; 优化可执行文件防病毒; 文件过滤驱动在反病毒上的应用。这是本章涉及的问题。1.1 病毒概述“计算机病毒最早是由美国计算机病毒研究专家F.Cohen博士提出的。“计算机病毒有很多种定义,国外流行的定义为:是一段附着在其他程序上的可以实现自我繁殖的程序代码。在?中华人民共和国计算机信息系统安全保护条例?中的定义为:“计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代

2、码。世界上第一例被证实的计算机病毒是在1983年,出现了计算机病毒传播的研究报告。同时有人提出了蠕虫病毒程序的设计思想;1984年,美国人Thompson开发出了针对UNIX操作系统的病毒程序。1988年11月2日晚,美国康尔大学研究生罗特莫里斯将计算机病毒蠕虫投放到网络中。该病毒程序迅速扩展,造成了大批计算机瘫痪,甚至欧洲联网的计算机都受到影响,直接经济损失近亿美元。计算机病毒是人为编写的,具有自我复制能力,是未经用户允许执行的代码。一般正常的程序是由用户调用,再由系统分配资源,完成用户交给的任务。其目的对用户是可见的、透明的。而病毒具有正常程序的一切特性,它隐藏在正常程序中,当用户调用正常

3、程序时窃取到系统的控制权,先于正常程序执行,病毒的动作、目的对用户时未知的和未经用户允许的。它的主要特征有传染性、隐蔽性、潜伏性、破坏性和不可预见性。传染性是病毒最重要的一条特性。按照计算机病毒侵入的系统分类,分为DOS系统下的病毒、Windows系统下的病毒、UNIX系统下的病毒和OS/2系统下的病毒。按照计算机病毒的链接方式分类可分为源码型病毒、嵌入型病毒、外壳型病毒。按照传播介质分类,可以分为可分为单机病毒和网络病毒。随着Windows系统的开展,引导型病毒已经不再,宏病毒也少见。目前见得多的是感染本机可执行文件的PE病毒和通过网络在计算机之间传播的蠕虫病毒比较常见。1.2 PE病毒分析

4、Windows下常见的可执行文件,一种是二进制文件,就是扩展名为exe、dll、src和sys等的文件,它们的执行是由explorer.exe资源管理器、cmd.exe控制台,类似DOS界面或其它程序调用执行的。另一种是文本格式文件,例如扩展名为htm和html,可以由iexplorer.exe调用,由script.exe来解释执行的文件。 从Windows2000以后,其二进制文件文件为PE构造。PE的意思就是可移植的执行体Portable Executable,它是 Windows的32位环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object

5、file format)文件格式,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保存了MS-DOS中那熟悉的MZ头部。病毒能够感染PE文件,因为病毒设计者深知其构造。1.2.1 PE病毒常用技术病毒也和正常的应用程序一样,涉及到函数的调用和变量的使用。1、调用API函数的方法API是“Application Programming Interface的英文缩写,很象DOS下的中断。中断是系统提供的功能,在DOS运行后就被装载在内存中,而API函数是当应用程序运行时,通过将函数所在的动态连接库装载到内存后调用函数的。请大家先在MSDN的“索引中输入函数“Messa

6、geBox然后回车,就可以查到该函数的使用方法。MSDN是微软提供的开发帮助,是在Windows下编程必备的资料文件。在Windows下设计应用程序不直接或间接使用API是不可能的,有些高级语言看似没有使用API,只不过它们提供的模块对API进了封装。API的使用分为静态和动态使用两种方式。在源程序中调用API两种方式都可以使用,但对未公开API因为无相应的头文件,只能使用动态方式。下面以VC+中调用MessageBox说明两种方式的区别。(1) 静态方式char note_inf=谢谢使用;char note_head=提示信息;:MessageBox(0, note_inf, note_h

7、ead,MB_OK); /:表示全局函数反汇编结果如图3-1。“PUSH 00000000对应的是MB_OK常量入栈,“PUSH 0040302C对应的是一个字符串的偏移地址入栈,“PUSH 00403020对应的是另一个字符串偏移地址的入栈,第2行“PUSH 00000000对应窗口句柄入栈。当程序执行时,装载器会将user32.dll装载到应用程序虚拟空间,同时将MessageBoxA对应ANSI格式,另一种为UNICODE格式,用MessageBoxW表示。这是因为函数的参数有字符串,而字符串有两种格式所致的入口地址填充到虚拟地址004021B8h。虚拟地址004021B8h是由PE头中

8、IMAGE_DATA_DIRECTORY数组来定位的,当编译器生成PE文件时就计算好了。图3-1 API的汇编调用(2) 动态方式动态方式先定义函数指针,使用函数LoadLibrary装载要调用的函数所在的dll文件,获取模块句柄。然后调用GetProcAddress获取要调用的函数的地址。void CTestDlg:OnButton/定义MessageBox函数指针typedef int (WINAPI *_MessageBox)( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );/定义MessageBox指针变量_Mes

9、sageBox new_MessageBox; /装载MessageBox函数所在dll文件HINSTANCE hb=LoadLibrary(user32.dll);/获取ANSI格式的MessageBox函数地址new_MessageBox=(_MessageBox)GetProcAddress(hb,MessageBoxA);/动态调用函数MessageBoxnew_MessageBox(0,欢迎使用!,提示信息,MB_OK);/释放MessageBox函数所在模块CloseHandle(hb); 动态方式是在需要调用函数时才将函数所在模块调入到内存的,同时也不需要编译器为该函数在导入表中

10、建设相应的项。2、病毒调用API函数病毒要完成相应的功能,不可能不调用API函数。病毒感染PE文件可能是在源程序中参加病毒代码,但多数是在生成PE文件后通过修改PE文件感染的。对后种情况,病毒难以去为使用的API建设导入表项,只有使用第动态方式调用API。动态使用API的前提是预先知道LoadLibrary和GetProcAddress的地址,可以预先设定或搜索API的地址实现。一个正常的Windows程序,它至少需要调用模块kernel32.dll,因为应用程序正常退出时需要调用函数ExitProcess,而该函数位于模块kernel32.dll内。然而函数LoadLibrary和GetPr

11、ocAddress也位于模块kernel32.dll内。既然模块kernel32.dll总在内存,如果我们知道这两个函数地址,直接调用就可以了。(1) 检测函数地址先用间接方式检测函数的地址,代码如下,结果见图3-2。void CTestDlg:OnButton1() /定义函数LoadLibrary和GetProcAddress的原型typedef HINSTANCE (WINAPI *_LoadLibrary)(LPCTSTR lpLibFileName );typedef FARPROC (WINAPI *_GetProcAddress)(HMODULE hModule, LPCSTR

12、lpProcName ); /定义指针_LoadLibrary new_LoadLibrary; _GetProcAddress new_GetProcAddress;/装载函数所在模块kernel32.dllHINSTANCE hb=LoadLibrary(kernel32.dll);/获取函数首地址new_LoadLibrary=(_LoadLibrary)GetProcAddress(hb,LoadLibraryA);new_GetProcAddress=(_GetProcAddress)GetProcAddress(hb,GetProcAddress);/显示结果CString inf

13、;inf.Format(LoadLibrary =%XhrnGetProcAddress=%Xh,new_LoadLibrary,new_GetProcAddress);:MessageBox(0,inf,地址信息,MB_OK);CloseHandle(hb);图3-2 取函数地址(2) 在程序中直接使用函数地址如下的代码直接使用函数LoadLibrary和GetProcAddress地址,然后用它们动态调用函数MessageBox,执行的结果是显示信息框。void CTestDlg:OnButton2() /定义MessageBox原型typedef int (WINAPI *_Messag

14、eBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );char funName=MessageBoxA;/定义地址DWORD LoadLibraryAddr =0x77E80221;DWORD GetProcAddressAddr =0x77E80CAB;_MessageBox new_MessageBox; /定义函数所在模块名HINSTANCE hb;char dllName=user32.dll;_asm ;VC+中嵌入汇编代码lea eax, dllName push eax mov ebx, LoadLibraryAddr call ebx ;调用LoadLibrary获取shell32.dll模块句柄 mov hb, eax /直接使用地址 lea eax,funName push eax push hb mov ebx, GetProcAddressAddr ;调用LoadLibrary获取shell32.dll模块句柄 call ebx mov new_MessageBox, eax/动态调用MessageBox,显示信息框new_MessageBox(0,欢迎使用!,提示信息,MB_OK);CloseHandle(hb);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号