gpt4 book ai didi

hex - 为什么PE文件中的MZ DOS Header Signature是0x54AD?

转载 作者:行者123 更新时间:2023-12-04 14:20:59 25 4
gpt4 key购买 nike

我最近开始使用 PE(可移植可执行文件) 文件格式,更具体地说是 PE/COFF。我正在阅读 Randy Kath 的教程 here .

当我阅读 MZ DOS 头的结构时,我发现 MZ DOS 头是使用 e_magic 字段中的签名验证的。结构如下:

typedef struct _IMAGE_DOS_HEADER {  // DOS .EXE header
USHORT e_magic; // Magic number
USHORT e_cblp; // Bytes on last page of file
USHORT e_cp; // Pages in file
USHORT e_crlc; // Relocations
USHORT e_cparhdr; // Size of header in paragraphs
USHORT e_minalloc; // Minimum extra paragraphs needed
USHORT e_maxalloc; // Maximum extra paragraphs needed
USHORT e_ss; // Initial (relative) SS value
USHORT e_sp; // Initial SP value
USHORT e_csum; // Checksum
USHORT e_ip; // Initial IP value
USHORT e_cs; // Initial (relative) CS value
USHORT e_lfarlc; // File address of relocation table
USHORT e_ovno; // Overlay number
USHORT e_res[4]; // Reserved words
USHORT e_oemid; // OEM identifier (for e_oeminfo)
USHORT e_oeminfo; // OEM information; e_oemid specific
USHORT e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

教程说:

All MS-DOS-compatible executable files set this value to 0x54AD, which represents the ASCII characters MZ.

我的问题是一样的。

MZ的ascii值分别是7790,转化为十六进制的 4D5A0x54AD如何表示MZ

这可能是个愚蠢的问题。但如果它太愚蠢,请帮助我理解。

谢谢。

最佳答案

首先,声明签名的来源是 0x54AD是错的; MZ十六进制实际上是 0x5A4D (对于小端架构),如该程序的输出所示:

#include <Windows.h> // for the USHORT type
#include <stdio.h>

int main()
{
USHORT MZ = ('M' | 'Z' << 8);
printf("0x%.4hX\n", MZ);
return 0;
}

输出:

0x5A4D

您可能还有疑问,为什么 'Z' 的字节( 5A ) 当签名实际上是 'MZ' 时先出现?

这与字节顺序有关,字节顺序是字节存储在各个半字、字、双字等中的顺序。

Big-endian 将字节的最高有效字节存储在最高内存地址,而little-endian 则相反,将最高有效字节存储在最低有效内存地址。

x86 和 x64 架构是小尾数法,因此 MZ 中的最高有效字节(即 Z )排在第一位。

关于hex - 为什么PE文件中的MZ DOS Header Signature是0x54AD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com