PE文件结构简介.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文档。上传文档
查看更多
PE文件结构简介

在文件头中已经定义了文件的节的数目:0ah个,那么该文件的节表共有11个IMAGE_SECTION_HEADER结构,这个图中,我对第一个结构和最后一个结构做了标示。 最后的这一部分,是由于对齐的原因,文件在编译的时候编译器填充的零数据。 第一个结构中, 对其中的每个字段进行了划分。依次是: 节名称 “CODE” 内存中块的大小 内存中的起始rva 节区的RVA地址 文件中块的大小 文件中块的偏移 下面连续的四个字段是obj文件使用的一些字段 最后一个是块的属性,比如,代码段可读、可执行,但不能写等。 下面介绍一下rva 和文件偏移的转换 这个图一共有2个部分,上面的部分是PE头里的一些信息,下面的图是节表中第一个结构的信息, 从第一个图中我们根据前面讲的知识可以找到程序入口点偏移地址(就是红色方框标记的)读取后地址为从下面的图中,我们可以读出该节在内存中和文件中的大小以及其实偏移地址。 有了这些信息,我们就可以将程序的rva转换成文件中的偏移, 计算偏移只要两步。 第一步,判断rva在那个数据节中。计算方法如下: 第一个节的范围是:– 00130f00 各个节的计算方法相同, 下面是我计算好的各个节的范围 可见程序的入口点在程序的第九个数据节中。 最上面的图是节表中第九个结构中的数据,可以验证一些,入口点的地址是落入该节中的。 下面的公式就是rva和文件偏移的转换公式。我们用这个公式来转换一下,得到结果 在下面我把在内存中相关的地址和内存中的地址给出了,大家可以看到是相同的数据, 这说明我们的计算没有错误。 .text:是在编译或汇编结束是产生的一种块,它的内容全部是指令代码。也有的编译器将该段命名为.code .data:是初始化的数据块,包含那些编译时被初始化的变量、字符串 .idata:包含其他外来dll的函数和数据信息,也就是输入表,也有人称之为导入表。 .rsrc:包含模块的全部资源数据,如图标、菜单、位图等。 .reloc:用于保存基址的重定位表。即当装在程序不能按照连接器所指定的地址装载文件是,需要对指令或已经初始化的变量进行调整,该块中也包含了调整过程中所需要的一些数据,如果装载能够正常装在则忽略此段中的数据 .edata:是pe文件的输出表,以供其他模块使用,并不是每个pe文件都有此数据段,因为有的文件并不需要输出一些函数,该数据段常见于动态连接库文件中。 .radata:该数据块并不常见主要是用于存放一些调试信息。 下面对一些常见的节数据进行介绍,先看导入表,也就是.data节 导入表由一系列的IMAGE_IMPORT_DESCRIPTOR结构组成,结构的数量取决于程序要使用的DLL文件的数量,每个结构对应一个DLL文件,例如,如果一个PE文件从10个不同的DLL文件中引入了函数,那么就存在10个IMAGE_IMPORT_DESCRIPTOR结构来描述这些DLL文件,在所有这些结构的最后,由一个内容全为0的IMAGE_IMPORT_DESCRIPTOR结构作为结束。 ForwarderChain:当程序调用一个dll中的函数A,而函数A又需要调用其他dll中的函数B时使用该字段。这种情况很少见,该字段也就很少被用到。一般为0 FirstThunk:该字段在文件中看到的数据是和第一个字段OriginalFirstThunk是一样的,这里之所以叫做地址是由于程序加载到内存后是会对该字段重写,将地址写入到这里 nName字段 这个字段是一个RVA值,指向一个定义了模块名称的字符串。这个字符串说明了模块的原始文件名,比如说即使Kernel32.dll文件被改名为Ker.dll,仍然可以从这个字符串中的值得知它被编译时的文件名是“Kernel32.dll”。 NumberOfFunctions字段 文件中包含的导出函数的总数。 NumberOfNames字段 被定义了函数名称的导出函数的总数。显然,只有这个数量的函数既可以用函数名方式导出,也可以用序号方式导出,剩下的NumberOfFunctions减去NumberOfNames数量的函数只能用序号方式导出。NumberOfNames字段的值只会小于或者等于NumberOfFunctions字段的值,如果这个值是0,表示所有的函数都是以序号方式导出的。 AddressOfFunctions字段 这是一个RVA值,指向包含全部导出函数入口地址的双字数组,数组中的每一项是一个RVA值,数组的项数等于NumberOfFunctions字段的值。 nBase字段 导出函数序号的起始值。将AddressOfFunctions字段指向的入口地址表

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档