如何确定x86-64可执行文件中_main的位置?

时间:2013-07-17 14:05:12

标签: assembly x86 x86-64

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

的位置

1 个答案:

答案 0 :(得分:2)

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

获取入口点地址

实际PE可执行文件的基础(术语image在文档中提供)位于旧的DOS .exe MZ可执行文件中。每个可执行文件的前两个字节是ASCII“M”和“Z”。 如今,DOS标题被跳过。它过去包含的值包括CSIPSSSP

  1. 获取文件中偏移量0x3C的值。这是PE头的开始。
  2. PE标头存储目标机器,节数等字段。这些对你来说并不重要。

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

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

    3. 获取入口点的文件偏移量

      获取入口点的文件偏移更加困难。这个过程如下:

      1. 查找包含入口点的部分。通常它是.code部分,但如果将部分的开头与代码基础进行比较(代码基础的值位于PE可选标头标准字段中),则会更好。
      2. Substract部分的虚拟地址(只是在加载可执行文件时在内存中开始)=>你将得到入口点的偏移量(偏移量是从部分开始的相对值)。
      3. 我们有偏移量,所以只需将.code部分的文件偏移量添加到上一步的结果中,您就完成了。
      4. 所有这些步骤通常不会引导您到主要的地址,而是通过调用_main函数的CRT入口点的地址。

        如果您不想获取main的地址,则必须浏览PE对象文件并在符号表中找到符号_main