我有兴趣使用静态方法从x86-64可执行文件构建CFG。我在包含“main”函数时遇到问题,因为没有预先计算跳转到main函数;在程序实际运行之前,似乎无法计算跳转。因此,我的CFG缺少一个最重要的功能 - 主要功能!如何静态确定_main?
的位置答案 0 :(得分:2)
有关详细信息,请阅读Microsoft PE specification。
获取入口点地址
实际PE可执行文件的基础(术语image
在文档中提供)位于旧的DOS .exe
MZ可执行文件中。每个可执行文件的前两个字节是ASCII“M”和“Z”。
如今,DOS标题被跳过。它过去包含的值包括CS
,IP
,SS
或SP
。
0x3C
的值。这是PE头的开始。PE标头存储目标机器,节数等字段。这些对你来说并不重要。
您可以简单地跳过整个PE标头。 (将0x14
添加到指针 - sizeof(PE_HEADER_S)==20
)
在指针中添加20
个字节后,您将指向PE可选标头标准字段的开头。在偏移0x10
上,DWORD
包含相对于图像库的入口点的地址。
获取入口点的文件偏移量
获取入口点的文件偏移更加困难。这个过程如下:
.code
部分,但如果将部分的开头与代码基础进行比较(代码基础的值位于PE可选标头标准字段中),则会更好。.code
部分的文件偏移量添加到上一步的结果中,您就完成了。 所有这些步骤通常不会引导您到主要的地址,而是通过调用_main
函数的CRT入口点的地址。
如果您不想获取main的地址,则必须浏览PE对象文件并在符号表中找到符号_main
。