IMAGE_DOS_HEADER解析

目录

预备知识

一、C32Asm

C32Asm是一款国产的16进制编辑器,可以十分方便的对二进制文件进行各种编辑操作,同时支持反汇编操作。
本系列实验主要使用C32Asm作为编辑器,同类的编辑工具还有WinHex、010Editor等。

二、PEiD

PEiD是一款查壳工具,可以查看PE文件的加壳信息,如果文件没有被加壳,则可以识别PE文件的编译器信息。此外,PEiD还可以用于查看PE文件的基本结构信息。

三、StudPE

StudPE可以查看PE文件的基本信息,同时支持对PE文件结构中相关字段的定位,即通过字段的选择,可以自动在16进制数据窗口中选择相关的数据。

四、LordPE

LordPE除了可以查看PE文件的基本信息之外,还支持对PE文件的编辑操作,可以修改PE文件中各个字段或者结构的数据然后进行保存。

实验目的

1)掌握C32Asm、PEiD、StudPE、LordPE等工具的基本使用方法;
2)了解PE文件相关的帮助文档;
3)了解PE文件的IMAGE_DOS_HEADER结构。

实验环境

IMAGE_DOS_HEADER解析
服务器:Windows XP,IP地址:随机分配
辅助工具:C32Asm、PEiD、StudPE、LordPE

实验步骤一

环境配置以及C32Asm工具的使用。
PE文件学习相关的工具主要有C32Asm、PEiD、StudPE以及LordPE,这些工具全部存放于实验机器的C:\Tools目录下,同时在桌面存放有快捷方式。同时,为了方便快速启动这几个工具,可以把他们的快捷方式放到右键菜单的“发送到”菜单项下,具体的操作方法为:
1.点击“开始”菜单,点击“运行”并输入SendTo后点击“确定”按钮,即可在资源管理器中打开SendTo文件夹;
2.将桌面上的C32Asm、PEiD、StudPE、LordPE这四个工具的快捷方式复制到SendTo文件夹之下;
3.现在选中任意一个文件,通过右键菜单的“发送到(N)”选项,即可选择使用C32Asm、PEiD、StudPE或者LordPE这几种工具中的一种打开文件了。
在学习PE文件的结构时,记事本将会是我们经常操作的一个对象,这里复制了一个副本到C:\PE\notepad.exe。在资源管理器中打开C:\PE目录,将notepad.exe通过右键菜单发送到C32Asm,即可在C32Asm中打开notepad.exe文件了,操作步骤如下:
1.打开C:\PE,使用鼠标选中notepad.exe,单击鼠标右键,在弹出的右键菜单中选择“发送到(N)”、“C32Asm”,如下图所示:
IMAGE_DOS_HEADER解析
2.发送之后,C32Asm将打开notepad.exe文件,如下图所示:
IMAGE_DOS_HEADER解析
C32Asm是一款16进制编辑器,也是在本系列实验中需要经常使用到的工具。现在来熟悉一下它的操作界面,主要分为四部分,如下图所示:
IMAGE_DOS_HEADER解析
1.地址栏,以16进制形式显示当前行的起始地址,如0x00000000、0x00000010等,可以看出每一行的大小为0x10,也就是16个字节;
2.数据栏,以16进制形式显示文件的数据,如字符M的ASCII值为77,转换为16进制就是0x4d,那么在C32Asm中显示的内容便是4D;
3.状态栏,当使用鼠标在数据栏中选中一定长度的数据时,在状态栏中会提示选中的内容有多长,即选中的字节数有多少。在上图中,选中了4行数据,长度为0x40,转换为十进制就是64字节;
4.ASCII文本栏,在该栏中显示文件数据对应的ASCII字符,如第一个字节的内容是4D,也就是0x4d,转换为十进制便是77,对应的ASCII字符为M,因此在这一栏中便会在对应的位置显示字符M;注意ASCII表中只有值为32~126的字符才是可以显示的,其他ASCII值的字符不可显示,对于不可显示的字符,C32Asm会以点号“.”来代替。

实验步骤二

PE文件格式文档以及PEiD的使用。
Windows下的大多数恶意软件都属于PE文件,熟悉PE文件格式是进行恶意软件分析的必备技能,但是PE文件那么复杂,能够完全记住其中各个字段的意义吗?不排除部分同学具有这样的能力,但是事实上很难也没有必要,只要学会查阅PE文件格式的相关文档,就可以快速了解各个字段的含义了。在实验机器的C:\PE\docs目录下保存了PE文件格式相关的文档,分别是:
1.pe.jpg,PE文件中相关结构体的定义以及结构之间的基本关系图;
2.pecoff_v8.doc,微软官方提供PE文件格式文档,对PE文件做了十分详细的介绍;
3.pecoff_v8_chs.pdf,第三方人员对微软官方文档翻译形成的中文版文档;
4.WinNT.h,Windows SDK中提供的头文件,给出了PE文件中相关结构体的详细定义。
PE(Portable Executable)文件格式是Windows平台下可执行文件的统一格式规范,扩展名为*.exe、*.dll、*.ocx、*.sys等的文件都属于PE文件。PE文件由DOS头部、DOS Stub模块、PE文件头、节区表、节区数据块以及尾部附加的调试信息几个部分组成,PE文件的总体结构图如下图所示:
IMAGE_DOS_HEADER解析
从上图中可以看出,从文件头部到文件尾部的内容依次为:DOS头部、PE文件头、块表、块、调试信息等。其中Section又称为“节”、“节区”,采用比较常规的叫法,也叫“节区”。
现在使用PEiD来查看PE文件的节表以及对应的节区数据。打开C:\PE,选中notepad.exe后通过右键菜单发送到PEiD,即可在PEiD中打开notepad.exe,对应的界面以及介绍如下图所示:
IMAGE_DOS_HEADER解析
这里关心的是节区头部信息,因此需要点击PEiD主界面中最右侧一列的第一个“>”按钮,点击后即可看到如下的界面:
IMAGE_DOS_HEADER解析
可以看到notepad.exe包含了三个节区,分别为:
1…text节区,对应代码段,里面保存的是汇编指令对应的机器码;
2…data节区,对应数据段,里面保存的是数据相关的信息;
3…rsrc节区,对应资源段,里面保存的是资源相关的数据。
如果要查看对应节区的具体数据,可以在“节查看器”中选中对应的节所在的行,然后单击右键,在弹出的右键菜单中选择“Hex查看器”即可,如下图所示:
IMAGE_DOS_HEADER解析

实验步骤三

IMAGE_DOS_HEADER结构学习以及StudPE的使用。
现在开始具体的学习PE文件相关的结构,首先是PE文件头部的DOS头,对应WinNT.h中的结构体为IMAGE_DOS_HEADER。那么如何在WinNT.h这个头文件中找到它的定义呢?这个比较简单,直接使用Notepad++打开后搜索IMAGE_DOS_HEADER即可。该结构的具体定义如下:

typedef struct _IMAGE_DOS_HEADER {
    WORD   e_magic;         // MZ标志
    WORD   e_cblp;
    WORD   e_cp;
    WORD   e_crlc;
    WORD   e_cparhdr;
    WORD   e_minalloc;
    WORD   e_maxalloc;
    WORD   e_ss;
    WORD   e_sp;
    WORD   e_csum;
    WORD   e_ip;
    WORD   e_cs;
    WORD   e_lfarlc;
    WORD   e_ovno;
    WORD   e_res[4];
    WORD   e_oemid;
    WORD   e_oeminfo;
    WORD   e_res2[10];
    LONG   e_lfanew;        // PE文件头偏移
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

可以看出结构体IMAGE_DOS_HEADER拥有很多的成员,为了方便对PE文件格式的学习,只讲解其中最重要的字段,后面的实验同样遵循这样的原则。在IMAGE_DOS_HEADER结构中,只关心e_magic以及e_lfanew,分别是第一个字段以及最后一个字段。在讲解这两个字段的含义之前,我们先介绍一下BYTE、WORD、DWORD、LONG这几个类型的含义,这几个类型将经常出现在PE文件相关的结构体中,这几个类型的定义如下图所示:
IMAGE_DOS_HEADER解析
此外,还有必要了解一下数据的表示方法,即大端模式和小端模式。对于文件中相邻的四个字节0x12,0x34,0x56,0x78,其中0x12存放于文件的头部,0x78存放于文件的尾部,如果把这四个字节表示为一个DWORD类型的数据,如果是小端模式,则值为0x78563412,而如果是大端模式,则值为0x12345678。对小端模式而言,文件低地址处的数据表示DWORD中低字节的数据,而文件高地址处的数据表示DWORD中高字节的数据,关系如图所示:
IMAGE_DOS_HEADER解析
小端模式表示法即高地址的数据存放于类型的高位字节、低地址的数据存放于类型的低位字节,简称“高存高,低存低”;大端模式表示法则相反。Intel机器采用小端模式表示法,在学习PE文件时也使用小端模式表示法。
现在回到IMAGE_DOS_HEADER结构,我们介绍其中最重要的两个字段:

1.e_magic字段

e_magic字段类型为WORD,占用两个字节,表示PE文件的一个Magic标志,它的值固定为4D 5A,即PE文件的e_magic值一定就是4D 5A,如果不是4D 5A则表示不是PE文件,因此e_magic通常作为识别一个文件是否是PE文件的标准之一。在小端模式下,4D 5A表示为WORD类型的数据为0x5A4D,在WinNT.h头文件中定义了一个名为IMAGE_DOS_SIGNATURE的宏,它的值就是0x5A4D,如下所示:

#define IMAGE_DOS_SIGNATURE    0x5A4D  // MZ

2.e_lfanew字段

e_lfanew用于指定PE文件头的偏移,因为在IMAGE_DOS_HEADER头和PE头之间隔了一段DosStub数据,而DosStub的大小是可变的,所以需要通过e_lfanew才能找到PE文件头的位置。IMAGE_DOS_HEADER结构体的大小为64字节,而e_lfanew位于该结构的最后四字节,所以e_lfanew对应第61~64四个字节的数据(下标索引为60~63)。
现在我们使用StudPE来查看IMAGE_DOS_HEADER结构并学会如何定位PE文件头的位置。打开C:\PE,选中notepad.exe后通过右键菜单发送到StudPE,就可以在StudPE中打开notepad.exe文件了。现在在StudPE主界面中点击“在16进制编辑器中视图文件头树”这个按钮,如下图所示:
IMAGE_DOS_HEADER解析
之后即可看到左侧窗口的树形文件头以及右侧窗口的十六进制数据,可以看到右侧的十六进制数据显示窗口与我们之前介绍的工具C32Asm非常类似。选择左侧树形列表中“DOS文件头”的最后一个字段“新的exe文件头地址”(e_lfanew指向PE头),即可在右侧窗口中自动选中E0 00 00 00,小端模式下表示为0x000000E0,这就是IMAGE_DOS_HEADER结构中e_lfanew成员的值,它表示PE头的文件偏移值为0x000000E0,在右侧十六进制数据窗口的0xE0位置即可找到PE文件头,如下图所示:
IMAGE_DOS_HEADER解析
在右侧十六进制数据窗口的000000E0位置就是PE头的位置了,这里的数据为50 45,对应的ASCII字符是P和E,将在下一个实验中对此来进行介绍。

上一篇:4.PE文件之扩展PE头(IMAGE_OPTIONAL_HEADER)


下一篇:PE系列学习笔记八 实战之HOOK程序添加弹窗