我有兴趣使用静态方法从 x86-64 可执行文件构建 CFG。我在包含“main”函数时遇到了麻烦,因为没有预先计算到 main 函数的跳转;看来在程序实际运行之前可能不会计算跳转。因此,我的 CFG 缺少最重要的功能之一——主要功能!如何静态确定 _main 的位置?
问问题
360 次
1 回答
2
有关详细信息,请阅读Microsoft PE 规范。
获取入口点地址
实际 PE 可执行文件的基础(文档中优先使用该术语image
)位于旧的 DOS .exe
MZ 可执行文件中。每个可执行文件的前两个字节是 ASCII 'M' 和 'Z'。如今,跳过了 DOS 标头。它曾经包含诸如 start CS
、IP
或之SS
类的值SP
。
- 获取
0x3C
文件中偏移量的值。它是PE头的开始。
PE 头存储目标机器、节数等字段。这些东西对你来说并不重要。
您可以简单地跳过整个 PE 标头。(添加
0x14
到您的指针 -sizeof(PE_HEADER_S)==20
)向指针添加
20
字节后,您将指向 PE 可选标头标准字段的开头。在 offset0x10
上,DWORD
其中包含相对于图像库的入口点地址。
获取入口点的文件偏移量
获取入口点的文件偏移量有点困难。该过程如下所示:
- 查找包含入口点的部分。通常它是
.code
节,但如果将节的开头与代码基进行比较会更好(代码基的值位于 PE 可选标头标准字段中)。 - 减去节的虚拟地址(只是加载可执行文件时在内存中的节开始)=>您将获得入口点的偏移量(偏移量是相对于节开头的)。
- 我们有偏移量,所以只需将
.code
部分的文件偏移量添加到上一步的结果中,就完成了。
所有这些步骤通常不会将您引导至 main 的地址,而是指向调用该_main
函数的 CRT 入口点的地址。
如果你不想得到main的地址,你必须通过PE目标文件并_main
在符号表中找到符号。
于 2013-07-17T17:22:50.033 回答