使用 CFF 资源管理器和 msdn doc 分析 PE 文件以查找导出表地址

parsing a PE file to find the export table address using CFF explorer and msdn doc

提问人:Nerios 提问时间:10/1/2023 最后编辑:winapiadminNerios 更新时间:10/27/2023 访问量:142

问:

我处理一个 PE 文件,我尝试在 IDA 中解释这一行:

v4 = *(_DWORD *)((char *)LibraryA + *((_DWORD *)LibraryA + 15) + 120);

LibraryA 是 PE 文件的基址

*((_DWORD *)LibraryA + 15)相当于*(LibraryA + 60) = *(LibraryA + 0x3C) = *(LibraryA + e_lfanew) = 0x100 = PEOffset

因此,根据 CFF Explorer 指向导出目录*((_DWORD *)LibraryA + 15) + 120

当我使用 CFF 浏览器时 > Nt 标头 > 可选标头 > 数据目录 > 导出表地址 = 0x178 = 0x100 (PE 偏移量) + 0x78 (导出表地址)

但是当我使用 msdn 文档 https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#optional-header-data-directories-image-only 时,我看到导出表的 PE 偏移量为 96 (0x60),而不是在 CFF Explorer 中找到的值: 120 (0x78)

我认为我在使用 msdn 文档时错了,但我不知道在哪里?

c 分析 MSDN 移植可执行文件

评论

3赞 greg spears 10/1/2023
我同意你关于偏移等价性的假设,但我没有对你提到的每个项目进行严格检查。太深了!相反,我鼓励您将相同的指针数学/表达式应用于您声明的缓冲区并用已知数据填充。然后查看指针表达式返回的数据是否与已知处于预期缓冲区偏移量的数据匹配。右?这样,您至少可以确定指针算术和相关偏移量 - 然后也许您可以知道 CFF Explorer 是否出错。
1赞 Nerios 10/2/2023
感谢您的评论,我在另一个示例上尝试了 CFF Explorer,它再次为导出表地址提供了良好的偏移量,这是我使用 msdn 的 info giben 的方式,这是错误的,我不知道目前在哪里,这些天我会再次搜索
2赞 greg spears 10/2/2023
嗨,@Nerios -- 我对这个问题很好奇(我喜欢编码),所以我按照建议为你设置了初始测试台。您可以添加到此代码中 -- 测试各种指针数学和关于您拥有的偏移量的假设。问题出在以下 3 个地方之一:1.) CFF Explorer 2.)你的指针算术或 3.)您对 msdn 规范的理解。我希望这能帮助您缩小范围。

答:

1赞 Nerios 10/2/2023 #1

(感谢 Kz2023 的建议;我不知道这个网站,godbolt.org。

我的问题的答案很简单:在msdn中,为导出表地址提供的偏移量与OptionalHeader相关,在代码中,偏移量与PE COFF标头相关

提醒:PE COFF 标头的大小为 0x18 字节,这是我注意到的 msdn 的 96 字节 (0x60) 和代码中的 120 字节 (0x78) 之间的差异PE layout

评论

0赞 greg spears 10/3/2023
吵!所以你解决了这个问题--太好了!
0赞 winapiadmin 10/20/2023 #2

我在查找调试目录时弄错了(有关更多信息,请参阅读取调试目录时奇怪的条目类型4194304),这将适用于另一个目录条目,例如导入目录、导出目录等。

这是数据目录条目的偏移量,而不是导出表的节条目偏移量。要获取导出部分内容,请使用该问题中的答案。