计算PE文件中入口点的文件偏移量

Calculating the file offset of a entry point in a PE file

http://en.redinskala.com/finding-the-ep/

有关于如何在 exe 文件中找到入口点的文件偏移量的信息。

我可以在这里阅读

EP (File) = AddressOfEntryPoint – BaseOfCode + .text[PointerToRawData] + FileAlignment

然而,当我自己计算时(我使用了几个不同的 exe 文件)我得出的结论是

Offset of entry point in EXE file = AddressOfEntryPoint + .text[PointerToRawData] - .text[VirtualAddress]

其中 AddressOfEntryPoint 是从 IMAGE_OPTIONAL_HEADER 中获取的,另外两个值是从 IMAGE_SECTION_HEADER 中获取的。

那个网页上的信息是假的吗?像他们那样添加 FileAlignment 似乎是错误的,没有意义。或者是吗?文件对齐建议我应该使用模数或其他方法来计算值。如果 BaseOfCode 和 FileAlignment 是相同的值(大部分是),将它们添加到计算中不会打扰,但它有什么意义?

正确,您根本不需要使用 FileAlignment 值。

算法应该如下所示(与您的非常相似):

  • 从 IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint 得到 AddressOfEntryPoint(这是一个 VA)
  • 搜索这个 VA 所在的第 header 部分(通常是第一个,但你应该真正搜索所有部分 headers)。
  • 获得正确的部分 header 后,获取其 VirtualAddressPointerToRawData 字段。
  • AddressOfEntryPoint中减去VirtualAddress:你现在有一个"delta"
  • 由于完全相同的增量适用于偏移量,因此:将 "delta" 添加到 PointerToRawData

您根本不需要 FileAlignment,因为入口点所在的部分已经与该值对齐。