您的位置:首页 > 其它

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

2011-12-11 22:41 197 查看
现在来详细的学习一下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,如导入地址表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: