便携式可执行DOS标头长度

时间:2015-03-07 06:08:15

标签: c++ c windows machine-code portable-executable

我一直在研究此图片,以构建可移植的可执行文件: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 ...

1 个答案:

答案 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