手工打造PE文件:[2]分析DOS头部
DOS头部:
struct _IMAGE_DOS_HEADER {
0x00 WORD e_magic; ;DOS可执行文件标记“MZ”,被#define IMAGE_DOS_SIGNATURE 0x5A4Dh
0x02 WORD e_cblp;
0x04 WORD e_cp;
0x06 WORD e_crlc;
0x08 WORD e_cparhdr;
0x0a WORD e_minalloc;
0x0c WORD e_maxalloc;
0x0e WORD e_ss;
0x10 WORD e_sp;
0x12 WORD e_csum;
0x14 WORD e_ip; ;DOS代码入口IP
0x16 WORD e_cs; ;DOS代码的入口CS
0x18 WORD e_lfarlc;
0x1a WORD e_ovno;
0x1c WORD e_res[4];
0x24 WORD e_oemid;
0x26 WORD e_oeminfo;
0x28 WORD e_res2[10];
0x3c DWORD e_lfanew; ;指向PE文件头“PE”,0,0
};
我们只关心第一个和最后一个这2个变量:
第一个:e_magic [WORD] -->4D 5A(* DOS可执行文件头标记)
//注释:此处值总是为MZ的16进制码。
最后一个:e_lfanew [DWORD] -->B0 00 00 00 (* 指向PE文件头的偏移量。0xB0=64+112)
//注释:此处的值正好为为DOS头部的大小,因为DOS头部后面就是PE文件头部分了。
了解了DOS头部,下面就可以开始我们的程序的第一步了,要准备的软件有:c32asm
1.首先新那建一个文件文件,我们将其改成t.exe,然后用c32asm打开,选择十六进制模式
2.然后点击 编辑->插入数据->插入数据大小:64,使用16进制填充:00;如图:
![手工打造PE文件:[2]分析DOS头部](https://exp-picture.cdn.bcebos.com/994f412043715fdb9f2be68f468920c5270f8ca0.jpg)
3.然后将上面分析的2个变量填充其中,如图:
![手工打造PE文件:[2]分析DOS头部](https://exp-picture.cdn.bcebos.com/dccb47de450788018b7b8af4b18ca608a40f82a0.jpg)
4.接下来我们来完成“MS-DOS 实模式残余程序”(Dos Stub),我们已经知道,他是用在DOS下执行的,我们这里可以直接用“00”来填充,
注意总共112 byte。 这两部分完成之后代码如下:
![手工打造PE文件:[2]分析DOS头部](https://exp-picture.cdn.bcebos.com/95bd4e8c9bcec7f8367c0268034ce54a2e27fba0.jpg)