第三章 计算机病毒结构分析(2).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 计算机病毒结构分析(2) (6)引入表(Import Table) 两个概念: 引入函数:是被某模块调用的但又不在调用者模块中的函数,因而命名为Import(引入)函数。引入函数实际位于一个或者更多的DLL里。调用者模块里只保留一些函数信息,包括函数名及其驻留的DLL名。 Data Directory:Optional Header最后一个成员就是DataDirectory,它是一个IMAGE_DATA_DIRECTORY结构数组,共有15个成员。Data Directory包含了PE文件中各重要数据结构的位置和尺寸信息。每个成员包含了一个重要数据结构的信息。Data Directory的每个成员都是IMAGE_DATA_DIRECTORY结构类型,其定义如下所示: IMAGE_DATA_DIRECTORY STRUCT VirtualAddress dd //数据结构的相对虚拟地址(RVA) isize dd //VirtualAddress所指向数据结构的字节数 IMAGE_DATA_DIRECTORY ENDS 15个成员 引入表:实际上是一个 IMAGE_IMPORT_DESCRIPTOR 结构数组。每个结构包含PE文件引入函数的一个相关DLL的信息。如果该PE文件从10个不同的DLL中引入函数,那么这个数组就有10个成员。该数组以一个全0的成员结尾。IMAGE_IMPORT_DESCRIPTOR结构的定义如下: IMAGE_IMPORT_DESCRIPTOR STRUCT Union Characteristics dd OriginalFirstThunk dd Ends TimeDateStamp dd ForwarderChain dd Name dd FirstThunk dd IMAGE_IMPORT_DESCRIPTOR ENDS OriginalFirstThunk含有指向一个IMAGE_THUNK_DATA结构数组的RVA。 FirstThunk与OriginalFirstThunk的结构相同,只是作用不同。 IMAGE_THUNK_DATA是一个指向IMAGE_IMPORT_BY_NAME结构的指针。注意 IMAGE_THUNK_DATA 包含了指向一个IMAGE_IMPORT_BY_NAME 结构的指针,而不是结构本身。 IMAGE_IMPORT_BY_NAME结构保存着一个引入函数的相关信息。 IMAGE_IMPORT_BY_NAME 结构的定义: IMAGE_IMPORT_BY_NAME STRUCT Hint dw  //引入函数在原dll中的索引号 Name db  //引入函数在原dll中的名字 IMAGE_IMPORT_BY_NAME ENDS 假设有几个 IMAGE_IMPORT_BY_NAME 结构,我们收集起这些结构的RVA(=IMAGE_THUNK_DATAs)组成一个数组,并以0结尾,然后再将数组的RVA放入OriginalFirstThunk。 FirstThunk与OriginalFirstThunk区别 用函数名调用:IMAGE_IMPORT_BY_NAME 用序号调用:IMAGE_THUNK_DATA值的低位字指示函数序数,而最高二进制位(MSB)设为1 。 例如,如果一个函数只由序数引出且其序数是1234H,那么对应该函数的IMAGE_THUNK_DATA值。 列出某个PE文件的所有引入函数的步骤: 第一,校验文件是否是有效的PE。 第二,从 DOS header 定位到 PE header。 第三,获取位于OptionalHeader的数据目录(DataDirectory)的地址。 第四,转至数据目录的第二个成员提取其VirtualAddress值。 第五,利用上值定位第一个IMAGE_IMPORT_DESCRIPTOR结构。 第六,检查OriginalFirstThunk值。若不为0,则顺着OriginalFirstThunk里的RVA值转入那个RVA数组。若OriginalFirstThunk为0,就改用FirstThunk值。有些连接器生成PE文件时会置OriginalFirstThunk值为0,这应该算是个bug。不过为了安全起见,我们还是先检查 OriginalFirstThunk的值。 第七,对于每个数组元素,我们用IMAGE_ORDINAL_FLAG32来检查该元素的最高位。如果该元素值的最高二进位为1,那么函数是由序数引入的,可以从该值的低字节提取序数。如果元素值的最高二进位为0,就可将该值作为RVA转入IMAGE_IMPORT_BY_NAME数组,跳过Hint就是函数名字了。 第八

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档