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,如导入地址表。
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,如导入地址表。
相关文章推荐
- [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式
- Java学习lesson 02
- NEHE的OpenGL-Lesson 02 Your First Polygon
- [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02
- iOS学习_Lesson02_分支结构
- [BEC][hujiang] Lesson02 Unit1:Working life ---Reading
- 【Android Training - 02】适配不同的屏幕[Lesson 2 - 适配不同屏幕密度]
- art of disassembly----chapter01----lesson11---how is a disassembler working----02
- Poedu_计算机基础_lesson02_20160826_二进制
- 第五课 画图板lesson 02 第二版(优化界面)
- Poedu_C语言提升_Lesson02_20161111_数据类型2
- Poedu_C++_Lesson02_2_20161220_重载、默认实参、inline、类型转换、引用
- 【笔记】模电--lesson 02 常用半导体器件
- 【Android Training - 02】适配不同的屏幕[Lesson 1 - 支持不同的屏幕大小]
- 【Android Training - 02】适配不同的屏幕[Lesson 3 - 实现可适配的UI流程]
- lesson1_02
- [jimmyzhouj 翻译] Nehe iOS OpenGL ES 2.0教程 --Lesson 02
- Lesson 02 Breakfast or lunch? 早餐还是午餐?
- Lesson 02 Getting an Image on the Screen
- art of disassembly----chapter01----lesson9--Opcodes and Mnemonics---02