宏病毒的感染和传播-武汉大学.PPT

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
宏病毒的感染和传播-武汉大学

《计算机病毒分析与对抗》第六讲 Windows病毒原理分析 武汉大学计算机学院 彭国军 guojpeng@whu.edu.cn 本讲的内容提纲 6.1 Windows PE病毒 6.2 宏病毒 6.3 脚本病毒 6.4 网页恶意代码 6.5 网络蠕虫 6.1 Windows PE病毒 6.1.1 病毒的重定位 6.1.2 获取API函数地址 6.1.3 搜索目标文件 6.1.4 内存映像文件 6.1.5 文件感染 6.1.6 返回Host 6.1.1 病毒的重定位 1.为什么需要重定位? 病毒在编译后,某些变量Var的地址(004010xxh)就已经以二进制代码的形式固定了。 ImageBase:400000H ImageBase:600000H 问题的产生原因及解决方法? 为什么程序加载到一个不同的位置之后会出错? 病毒是否能够事先预料到自己的病毒代码将添加到HOST什么位置?加载之后又在什么位置? 不能 怎么办? 代码重定位 常用的重定位方法1 常见的重定位方法2 常见的重定位方法3 6.1.2 获取API函数地址 为什么需要获取API函数地址? 病毒程序由于在感染HOST程序时仅仅是将自己的代码段部分拷贝或植入到HOST程序中。 因此病毒程序代码段中使用到的相关API函数地址无法通过HOST程序的IAT表直接获得。 系统中绝大部分API函数都集中在3个动态连接库:KERNEL32.DLL,USER32.DLL和GDI32.DLL。 病毒使用的所有API函数地址都可以从相关的DLL中获得,不过KERNEL32.DLL中的GetProcAddress和LoadLibrary函数已经足够用来获取病毒所需要的API函数。 那如何获取Kernel32.dll中的API函数地址? 6.1.2 获取API函数地址 如何获取API函数地址? (1)首先获得kernel32.dll的模块加载基地址 (2)然后通过kernel32.dll的引出函数表定位具体函数的函数地址。 (1)获得kernel32.dll的模块加载基地址-1 利用程序的返回地址,在其附近搜索KERNEL32模块基地址。 系统打开一个可执行文件时,它会调用Kernel32.dll中的CreateProcess函数,CreateProcess函数在完成应用程序装载后,会先将返回地址压入到堆栈顶端。当该应用程序结束后,会将返回地址弹出放到EIP中,继续执行。 而这个返回地址正处于KERNEL32.DLL的地址空间之中。这样,利用PE文件格式的相关特征(如03C偏移处内容存放着“PE”标志的内存地址等),在此地址的基础上往低地址方向逐渐搜索,必然可以找到KERNEL32.DLL模块的首地址。不过这种暴力搜索方法比较费时,并且可能会碰到一些异常情况。 (1)获得kernel32.dll的模块加载基地址-2 通过SEH链获得KERNEL32模块内地址 遍历SEH链,在链中查找prev成员等于0xFFFFFFFF 的EXCEPTION_REGISTER结构,该结构中handler值指向系统异常处理例程,它总是位于KERNEL32模块中。根据这一特性,然后配合类似1)的向前搜索方法就可以查找KERNEL32.DLL在内存中的基地址。 (1)获得kernel32.dll的模块加载基地址-3 通过PEB相关数据结构获取。 fs:[0]指向TEB结构,首先从fs:[30h]获得PEB地址,然后通过PEB[0x0c]获得PEB_LDR_DATA数据结构地址,然后通过从PEB_LDR_DATA[0x1c]获取InInitializationOrderModuleList.Flink地址,最后在Flink[0x08]中得到KERNEL32.DLL模块的基地址。这种方法比较通用,适用于2K/XP/2003。在Exploit的编写中,也通常采用这种方式。 (1)获得kernel32.dll的模块加载基地址-4 对相应操作系统分别给出固定的KERNEL32模块的基地址 对于不同的Windows操作系统来说,KERNEL32模块的地址是固定的,甚至一些API函数的大致位置都是固定的。 Windows 98为BFF70000 Windows 2000为77E80000 Windows XP为77E60000。 病毒在先对目标操作系统进行大致判断之后,可以直接使用相关KERNEL32模块的基地址。 (2) 通过kernel32.dll的引出函数表定位具体函数的函数地址。 通过函数序号查找函数地址 通过函数名称查找函数地址 通过函数序号查找函数地址 定位到PE文件头。 从PE文件头中的可选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。 从导出表的Base字段取得起始序号。 将需要

文档评论(0)

ailuojue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档