PE 文件中的 DOS 存根

Xav*_*ver 5 windows exe dos portable-executable

最近,我使用十六进制编辑器分析了一些 Windows 可执行文件。PE 标头从地址 0x100 开始,因此在 PE 映像实际开始之前有 256 字节的数据。前 256 字节:

Windows 可执行文件的前 256 个字节

我了解以下有关文件结构的信息

  • 0x00 - 0x3F:这是 MZ 标头(64 字节长)。
  • 0x40 - 0x4D:这 14 个字节编码了 7 个 x86(16 位模式)指令,这些指令用于使用 DOS 系统调用(中断 0x21)在屏幕上打印“此程序无法在 DOS 模式下运行。\r\r\n” )。
  • 0x4E - 0x78:这是字符串“此程序无法在 DOS 模式下运行。\r\r\n”,末尾带有美元符号,告诉 DOS 这是字符串的结尾。
  • 0x79 - 0x7F:这些是 NULL 字节;我猜想它们是为了对齐而插入的。

所以我知道前 128 个字节是做什么用的。我的问题是:接下来的 128 字节 (0x80 - 0xFF) 有何用途?(PE 映像在它们之后从 0x100 处开始。)

Ros*_*dge 5

这就是所谓的未记录的“Rich header”。它是 Microsoft 链接器插入的弱加密数据块,指示使用哪些 Microsoft 工具来生成可执行文件。它包括链接的目标文件的版本信息,因此包括有关使用的编译器、汇编器和其他工具的信息。

要解码 Rich 标头,请搜索标记Rich,然后获取后面的 32 位加密密钥。然后从Rich标记开始向后工作,将密钥与存储在其中的 32 位值进行异或,直到找到已解码的DanS标记。在这两个标记之间将是一个 32 位值对的列表。该对的第一个值标识所使用的 Microsoft 工具,第二个值指示使用此工具创建的链接对象文件的数量。工具 ID 值的高 16 位部分指示它是什么类型的工具,低 16 位部分标识该工具的构建版本。