1

我有兴趣使用静态方法从 x86-64 可执行文件构建 CFG。我在包含“main”函数时遇到了麻烦,因为没有预先计算到 main 函数的跳转;看来在程序实际运行之前可能不会计算跳转。因此,我的 CFG 缺少最重要的功能之一——主要功能!如何静态确定 _main 的位置?

4

1 回答 1

2

有关详细信息,请阅读Microsoft PE 规范

获取入口点地址

实际 PE 可执行文件的基础(文档中优先使用该术语image)位于旧的 DOS .exeMZ 可执行文件中。每个可执行文件的前两个字节是 ASCII 'M' 和 'Z'。如今,跳过了 DOS 标头。它曾经包含诸如 start CSIP或之SS类的值SP

  1. 获取0x3C文件中偏移量的值。它是PE头的开始。

PE 头存储目标机器、节数等字段。这些东西对你来说并不重要。

  1. 您可以简单地跳过整个 PE 标头。(添加0x14到您的指针 - sizeof(PE_HEADER_S)==20

  2. 向指针添加20字节后,您将指向 PE 可选标头标准字段的开头。在 offset0x10上,DWORD其中包含相对于图像库的入口点地址。

获取入口点的文件偏移量

获取入口点的文件偏移量有点困难。该过程如下所示:

  1. 查找包含入口点的部分。通常它是.code节,但如果将节的开头与代码基进行比较会更好(代码基的值位于 PE 可选标头标准字段中)。
  2. 减去节的虚拟地址(只是加载可执行文件时在内存中的节开始)=>您将获得入口点的偏移量(偏移量是相对于节开头的)。
  3. 我们有偏移量,所以只需将.code部分的文件偏移量添加到上一步的结果中,就完成了。

所有这些步骤通常不会将您引导至 main 的地址,而是指向调用该_main函数的 CRT 入口点的地址。

如果你不想得到main的地址,你必须通过PE目标文件并_main在符号表中找到符号。

于 2013-07-17T17:22:50.033 回答