the art of disassembly chapter01---lesson1--02

来源:互联网 发布:淘宝传说红包 编辑:程序博客网 时间:2024/05/24 15:38

现在来详细的学习一下PE文件头吧,下面再次给出PE文件头的结构:

IMAGE_NT_HEADERS    STRUCT

Signature                 dd               ?

FileHeader              IMAGE_FILE_HEADER <>

OptionalHeader        IMAGE_OPTIONAL_HEADER32<>

IMAGE_NT_HEADERS      ENDS

Signature 双字字段是PE文件头的标志,值为PE,0,0

FileHeader 字段为一个结构。OptionalHeader也是一个结构,我们将在下面的内容中来详细的了解这两个结构。


IMAGE_FILE_HEADER的结构定义如下:

IMAGE_FILE_HEADER          STRUCT

     Machine             word              ?

     NumberOfSections          word            ?

     TimeDatStamp                 dd                   ?

     PointerToSymbolTable           dd               ?

     NumberOfSymbols                   dd               ?

    SizeOfOptionalHeader             word               ?

    Characteristics                          word           ?

IMAGE_FILE_HEADRE            ENDS

下面给出结构中各个字段的具体含义:

字段名                                                                                      含义

Machine                                                                                   此文件的运行平台,如果是Intel平台,此值是IMAGE_FILE_MACHINE_I386(14CH)。

                                                                                                  此字段通常来讲对我们来说没有多大的意义,除非一个用处就是,可以修改此字段的值来使windows

                                                                                                  绝执行一个文件


NumberOfSections                                                               文件中节的数目。如果我们增加或是删除了文件中的节的话,我们就得修改此字段的值


TimeDataStamp                                                                    文件创建的时间。对我们没有用

PointerToSymbolTable                                                       供 调试用的

NumberOfSymbols                                                              供高度用的


SizeOfOptionalSize                                                             以下IMAGE_OPTIONAL_HEADER32结构的大小。必须设置成一个有效值


Characteristics                                                                    文件的属性,比如表明此文件是一个EXE文件还是一个DLL文件

一般来说,只有三个字段对我们有用处,Machine NumberOfSections 及Characterstics。Machine 与Characteristics的值一般不去修改他,我们可以使用NumberOfSections来枚举所有的节.

为了举例说明NumerOfSections r的用法, 让我们先小小的偏离一下主题来看看节表的内容。

节表是一个结构数组,每一个结构包含一个节的信息。如果文件中有三个节,那个对应的这个数组的元素即为3,同时,NumberOfSection的值也为3,节表中各个元素所描绘的节的信息与节在文件中的排列顺序相对应。我们可以通过NumberOfSections这个字段来得到文件中有几个节。你可能会想,用节表中最后一个元素以全0作为数组的结尾来得到数组的长度,就如对字符串的处理那样。实际上,windows本身也是这么干的,如果你把NumberOfSections 的值设置为比其原来的值更高的话,Windows也可以正常的运行此文件。由观察,Windows使用NumberOfSections的值,并检查每个结构,看结构是否全为0,如果全为0就中止对节的检索,如果不是,则继续直到NumberOfSections中指定的值为止。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

OK,现在我们继续我们的学习,现在来看看IMAGE_OPTIONAL_HEADER32 这个结构

IMAGE_OPTIONAL_HEADER32   包含了31个字段,有一些是非常重要的,有一些对我们一点用处都没有。现在我们就仅仅来看一些对我们有用的字段。

字段                                                                           函数

AddressOfEntryPoint                                             程序入口点的RVA。程序将从此处开始执行。如果你想改变程序第一条被执行的指令,你可以修改此值为一个指向将要被执行的

                                                                                   指令的新RVA


BaseImage                                                             程序的优先装载地址。如果此地址已被其他的模块占据,则程序将被装载到其他的地址空间中


SectionAlignment                                                  节在内存中的对齐粒度。比如,如果此值是4096(1000h),则意味着,每一个节的起始地址必须是4096的倍数,

                                                                                 如果第一个节在地址空间401000h处,它的大小写是10字节,那么下一个节的起始地址也必须是402000h.

FileAlignment                                                        节在文件中的对齐粒度,比如,如果此值是512(200h),每个节的起始必须为512的倍数。如果第一个节在文件偏移200h

                                                                                处,其大小只有10bytes,下一个节的开始地址必须在文件偏移的400h处。

SizeOfImage                                                         内存中整个PE文件的大小,其值是在根据SectionAligment对齐后,所有文件头+节的大小之和。


SizeOfHeaders                                                    所有文件头的大小+节表的大小。即磁盘文件的大小减去所有节的大小即得此值。当时,你也可以将此值当作第一个节在磁盘文件                                                                                  中的偏移值。

DataDirectory                                                      IMAGE_DATA_DIRECTORY结构数组,每一个结构给出了一个重要数据结构的RVA,如导入地址表。