我一直在研究此图片,以构建可移植的可执行文件:https://i.imgur.com/LIImg.jpg
图像/演练说PE标头从0x40开始(十进制64)。但是,十六进制转储表示DOS标头长度为32个字节。是否每个字段打包4个字节?
查看WinNT.h中的IMAGE_DOS_HEADER,它似乎也不合适。它有16个2字节字段,一个4长2字节数组,一个10长2字节数组,以及指向PE位置的4字节指针。你看,它没有任何方式,它不会加起来64 ...
答案 0 :(得分:3)
但是,十六进制转储表示DOS标头长度为32个字节。
Offset:0x30
00 00 00 00-00 00 00 00-00 00 00 00-40 00 00 00
0x30 + 16 = 0x40(64)。
typedef struct _IMAGE_DOS_HEADER
{
// Cumulative size:
WORD e_magic; // 2
WORD e_cblp; // 4
WORD e_cp; // 6
WORD e_crlc; // 8
WORD e_cparhdr; // 10
WORD e_minalloc; // 12
WORD e_maxalloc; // 14
WORD e_ss; // 16
WORD e_sp; // 18
WORD e_csum; // 20
WORD e_ip; // 22
WORD e_cs; // 24
WORD e_lfarlc; // 26
WORD e_ovno; // 28
WORD e_res[4]; // 36
WORD e_oemid; // 38
WORD e_oeminfo; // 40
WORD e_res2[10]; // 60
LONG e_lfanew; // 64
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
它有16个2字节字段,一个4长2字节数组,一个10长2字节数组,以及指向PE位置的4字节指针。无论如何,它看起来并没有达到64 ......
(16 * 2) = 32
(4 * 2) = 8
(10 * 2) = 20
+ 4
------------------
64