PE : 头文件解析
dos头:
word e_magin ; // “MZ标记”用于判断是否为可执行文件
......
D word e_IFanew // PE头相当于文件的偏移地址,用于定位PE文件
通过dos头去寻找PE开始的地方:你知道 E8 是啥不
//我想你应该知道这是啥,不然 你就自己看着办吧
NP头: 50 45 00 00 NP标记
标准PE头:
word Machine * 程序运行的CUP型号 00为任何型号 01 4C 为386及以后型号
word NumberOfSections * 除去PE头以外的区段数,节表个数
Dword TimeDateStamp * 时间戳 map文件 知道不,(加壳)
Dword PointerToStamp
Dword NumberOfSymbols
word SizeOfSymbols * 可选PE头 的大小,32位默认E0h, 64位默认F0h
word Characteristics * 每个位有不同的含义,需要转换成二进制去对应 相应选项
可选PE头:
word Magic * 说明文件类型是多少位的文件 10B为32位,20B为64位
Byte MajorLinkerVersion
Byte MinorLinkerVersion
Dword sizeOfCode * 所有的代码的和,必须是FileAlignment的整数倍 , 编译器填的,
Dword sizeOfInitializedData * 初始化的数据大小 必须是FileAlignment的整数倍 , 编译器填的,
Dword sizeOfUninitializedData * 未初始化的数据大小 必须是FileAlignment的整数倍 , 编译器填的,
Dword AddressOfEntryPoint * ImageBase +程序入口 = 真正程序入口点 OEP 183D7
Dword BaseOfCode * 代码开始的基址, 编译器填的,(程序入口与代码开始是不一样的)
Dword BaseOfDate * 数据开始的基址, 编译器填的,
* Dword ImageBase * 内存镜像基址(内存中所有的数据是从哪里开始的) 400000
Dword SectionAlignment * 内存对齐 notpade在内存中的大小为1000h
Dword FileAlignment * 文件对齐 notpade在文件中的对齐大小为200h
word MajorOperatingSystemVersion
word MinorOperatingSystemversion
word MajorImageVersion
word MinorImageVersion
word MajorSubsystemVersion
word MinorSubsystemVersion
Dword win32VersionValue
Dword SizeOfImage *文件拉伸后的大小,可以比实际的值大,他有一个实际分的值,但必须是内存对齐的整数倍
Dword SizeOfHeaders * 所有头+节表的大小 文件对齐
Dword CheckSum * 用来判断文件是否被修改,由系统检查 PE所有的数据两个字节的加,得到一个数
word Subsystem
word DllCharacteristics
Dword SizeOfStackReserve * 堆栈的最大值
Dword SizeOfStackCommit * 堆栈的实际值
Dword SizeOfHeapReserve * 堆的最大值
Dword SizeOfHeapCommit * 堆的实际提交值
Dword LoaderFlags
Dword NumberOfRvaAndSizes * 目录项数 16 他后面还有16个结构,每个有特别的含义,
节表
首先需要找到节表的位置
8字节 name
dword 节表未对齐时的数据尺寸(文件对齐)
dword 该节表在内存中的位置
dword 文件中拉伸后的大小
w w dword 在文件中的位置
3*word 无用数据
dword 节表属性