PE 文件中的 DOS 存根
DOS stub in a PE file
最近,我使用十六进制编辑器分析了一些 Windows 可执行文件。 PE header 从地址 0x100 开始,因此在 PE 映像实际开始之前有 256 字节的数据。前 256 字节:
我知道文件结构如下
- 0x00 - 0x3F:这是 MZ header(64 字节长)。
- 0x40 - 0x4D:这14个字节编码了7条x86(16位模式)指令,用于在屏幕上打印“This program cannot 运行 in DOS mode.\r\r\n”,使用 DOS 系统调用(中断 0x21)。
- 0x4E - 0x78:这是字符串“This program cannot 运行 in DOS mode.\r\r\n”结尾有一个dollar-sign,告诉DOS这是字符串的结尾。
- 0x79 - 0x7F:这些是 NULL 字节;我猜它们是为了对齐而插入的。
所以我知道前 128 个字节是做什么用的。我的问题是:接下来的 128 个字节 (0x80 - 0xFF) 有什么用? (PE 图像从它们之后的 0x100 处开始。)
就是所谓的无证"Rich header"。它是由 Microsoft 链接器插入的弱加密数据块,指示使用了哪些 Microsoft 工具来制作可执行文件。它包括链接的目标文件的版本信息,因此包括有关使用了哪些编译器、汇编器和其他工具的信息。
要解码 Rich header 搜索 Rich
标记,然后获取后面的 32 位加密密钥。然后从 Rich
标记向后工作,将密钥与存储在那里的 32 位值进行异或,直到找到解码的 DanS
标记。在这两个标记之间将是一个 32 位值对的列表。该对的第一个值标识使用的 Microsoft 工具,第二个值指示使用该工具创建了多少链接对象文件。 tool id 值的高 16 位部分表示它是什么类型的工具,低 16 位部分标识工具的构建版本。
最近,我使用十六进制编辑器分析了一些 Windows 可执行文件。 PE header 从地址 0x100 开始,因此在 PE 映像实际开始之前有 256 字节的数据。前 256 字节:
我知道文件结构如下
- 0x00 - 0x3F:这是 MZ header(64 字节长)。
- 0x40 - 0x4D:这14个字节编码了7条x86(16位模式)指令,用于在屏幕上打印“This program cannot 运行 in DOS mode.\r\r\n”,使用 DOS 系统调用(中断 0x21)。
- 0x4E - 0x78:这是字符串“This program cannot 运行 in DOS mode.\r\r\n”结尾有一个dollar-sign,告诉DOS这是字符串的结尾。
- 0x79 - 0x7F:这些是 NULL 字节;我猜它们是为了对齐而插入的。
所以我知道前 128 个字节是做什么用的。我的问题是:接下来的 128 个字节 (0x80 - 0xFF) 有什么用? (PE 图像从它们之后的 0x100 处开始。)
就是所谓的无证"Rich header"。它是由 Microsoft 链接器插入的弱加密数据块,指示使用了哪些 Microsoft 工具来制作可执行文件。它包括链接的目标文件的版本信息,因此包括有关使用了哪些编译器、汇编器和其他工具的信息。
要解码 Rich header 搜索 Rich
标记,然后获取后面的 32 位加密密钥。然后从 Rich
标记向后工作,将密钥与存储在那里的 32 位值进行异或,直到找到解码的 DanS
标记。在这两个标记之间将是一个 32 位值对的列表。该对的第一个值标识使用的 Microsoft 工具,第二个值指示使用该工具创建了多少链接对象文件。 tool id 值的高 16 位部分表示它是什么类型的工具,低 16 位部分标识工具的构建版本。