首页 > PE文件格式, Windows SDK > PE文件格式解析(二)

PE文件格式解析(二)

本文为什么是二?(*^__^*) 嘻嘻……上一篇见《神奇的栈溢出》。最近我在用SDK写一个简单的PE格式解析工具,界面模仿LordPE。这个代码到最后面我会将完整的工程文件发布出来,所以,这里都讲一点点原理。

这几天在空余时间写了RVA和文件偏移的转换、节表的解析。

什么是RVA呢?当文件加载如内存的时候,会有一个基地址,一般exe默认为0×00400000(由可选头中的ImageBase域指定,具体可在链接时进行指定),假如说,该进程内存地址为0×00401000的地方,他相对ImageBase的差值为0×1000,这个就是相对虚拟地址,也就是所谓的RVA

那VA又是什么呢?VA就是虚拟地址,就如上面提到的0×00401000,他的VA就是0×00401000,RVA是0×1000。

那文件偏移呢?文件偏移,一般称为Offset(Raw Data),也就是,你用十六进制编辑器打开一个文件,你看到的数据地址,也就是相对于文件头(从IMAGE_DOS_HEADER开始)的偏移,这个很好理解。

好了,现在Offset、VA、RVA都懂了。在PE文件中,节表紧跟在IMAGE_NT_HEADERS后面,以一个个IMAGE_SECTION_HEADER的形式存在,最后一个节表是空的,内容全部是0,表示节表头的结束。节表的具体内容可以参考《PE文件之IMAGE_SECTION_HEADER》。

了解了这些信息之后,就可以循环读取接表头数据,就可以自己进行解析了。

然后,RVA和Offset又是怎么转换的呢?我觉得这一点罗云彬的《Windows环境下32位汇编语言程序设计》讲的很详细,那就是对于节表以前的东西,RVA和Offset都是同一个东西,而因为节会有对齐问题,在磁盘上的对齐值和内存中的对齐值不一样,所以RVA和Offset才会出现不同。我们可以循环遍历节表头,看看RVA是否在某一个节区之内,如果在就算出RVA跟节表起始RVA的差值,然后加上节表起始Offset,于是就得到了这个RVA在文件中的偏移值了。当然,如果在节表之前,就没有必要进行查找了。

借用《加密与解密*第三版》一书的一张图:
PE文件物理结构与内存结构对比
发几张我做的截图:
节表头的解析
RVA和Offset的转换

下一个工作:导入表的解析。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> PE文件格式解析(二)
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 本文目前尚无任何评论.