PE .rdata 部分内容

逆向工程 聚乙烯 编译器 部分
2021-06-20 05:38:42

根据 MSDN,.rdataPE部分应该包含调试目录和描述字符串。我在别处读到它包含只读程序数据。转储几个文件,我发现其中.rdata包含 IAT、加载配置表和安全异常处理程序表。有人可以澄清.rdata一下我在那里发现的内容与这两种描述的目的和原因吗?另外,导入信息不应该在.idata吗?

我假设不同的编译器和同一编译器的不同版本以不同的方式对待相同的部分。如果是这种情况,我可以从哪里获得更多相关信息?

2个回答

这是习惯了各种只读数据被集中到.rdata。但是,这是权宜之计,而不是必要性。编译器和链接器可以将任何数据放在他们喜欢的任何位置,只要它在数据目录中正确引用即可。

第一个调用点应该是 Microsoft 的PE COFF 规范(当前为 v8.3)。关于理论与实践之间分歧的评论和指示可以在 RE 的另一个主题中找到

如果您只想提取/解析信息,则可以完全忽略部分名称;只需使用数据目录中的信息。

好的,基本上,尽可能少的部分很方便,因为每个部分都必须从一个新的物理页面开始,所以你可能会在这里和那里浪费几 KiB 的物理内存。此外,它占用更多的内核内存,需要更多的子节对象,更多的子节设置意味着更多的代码要执行,因此加载时间会稍微长一些。导入表必须位于只读部分中,但不需要位于其自己的部分中,因为它是使用 PE 标头中的指针访问的。它需要只读,否则用户代码可能会修改 IAT 并劫持对代码中的小工具或注入的 dll 的调用。至于loader,需要自己修改IAT。这意味着它暂时需要将 PTE 从只读更改为 COW,写入它会导致新的物理页面被分配为读/写,一旦完成,写保护那些分配的页面,从而保护 PTE。同样,.pdata 有时是它自己的部分,但它不需要并且可以包含在任何只读部分中,只要异常目录 RVA 位于可选的 PE 标头中即可。