综上所述,"DOS信息部分"对应框架的代码为:
可以看到最后的4个字节"40000000"也就是00000040H(下面如果直接在数值后加"H"的即表示为16进制)是指向他末尾的指针,也就是说明,我们把"DOS块"的部分给去掉了.
接下来是"PE信息部分",他的结构可以用下面的图来表示:
整个"PE信息部分"结构是这样的:
IMAGE_FILE_HEADER结构(PE文件头)和IMAGE_OPTIONAL_HEADER结构如下:
代码 |
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 4D 5A 00 5B D5 E2 C0 EF B6 BC C3 BB D3 C3 2C 2C MZ.[这里都没用,, 00000010 B1 C8 C8 E7 CE D2 D0 B4 3A CE D2 D2 B2 D6 BB 2C 比如我写:我也只, 00000020 CA C7 D2 BB B0 E3 CB A7 2C B2 BB CA C7 CC D8 2C 是一般帅,不是特,8 00000030 B1 F0 CB A7 B5 C4 C0 B2 5D 00 00 00 40 00 00 00 别帅的啦]...@... |
可以看到最后的4个字节"40000000"也就是00000040H(下面如果直接在数值后加"H"的即表示为16进制)是指向他末尾的指针,也就是说明,我们把"DOS块"的部分给去掉了.
接下来是"PE信息部分",他的结构可以用下面的图来表示:
引用 |
+++++++++++++++++++++++++++++++++++++++++++++ + +++++++++++++++++++++++++++++++++++++++ + + +[PE标志][0x04] + + + +++++++++++++++++++++++++++++++++++++++ + + + <==PE信息部分 + +++++++++++++++++++++++++++++++++++++++ + + +[PE文件头][0x18] + + + +++++++++++++++++++++++++++++++++++++++ + + + + +++++++++++++++++++++++++++++++++++++++ + + +[自定义数据结构][0x0e] + + + +++++++++++++++++++++++++++++++++++++++ + +++++++++++++++++++++++++++++++++++++++++++++ |
整个"PE信息部分"结构是这样的:
代码 |
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //"PE标志"段,总是"PE00" IMAGE_FILE_HEADER FileHeader; //"PE文件头"段,指向IMAGE_FILE_HEADER结构 IMAGE_OPTIONAL_HEADER OptionalHeader; //"自定义数据"段,指向IMAGE_OPTIONAL_HEADER结构 } IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; |
IMAGE_FILE_HEADER结构(PE文件头)和IMAGE_OPTIONAL_HEADER结构如下:
代码 |
typedef struct _IMAGE_FILE_HEADER { WORD Machine; //运行平台,386的话是104CH WORD NumberOfSections; //文件节数目,最少为2 DWORD TimeDateStamp; //文件创建时间,随便设置(不过为了最后生成方便,随便设置的地方最好都设置为0) DWORD PointerToSymbolTable; //这里两项记用于调试,也随便设置 DWORD NumberOfSymbols; WORD SizeOfOptionalHeader; //下面那个IMAGE_OPTIONAL_HEADER结构的长度,一般为000EH(包括16个IMAGE_DATA_DIRECTORY结构),我们只要2个结构,所以设置为0070H WORD Characteristics; & |