《逆向工程核心原理》学习总结(四) - PE文件格式

介绍

PE文件是windows操作系统的可执行文件格式(包括.exe、.scr、.dll、.sys、.obj等文件),PE文件指32位的可执行文件,也称为PE3264位可执行文件称为PE+或PE32+,是PE32文件的一种扩展形式。

基本结构

PE文件包含PE头与PE体,研究PE文件格式,就是研究构成PE头的结构体。
PE头包含的基本结构如下:

1.DOS头
2.DOS存根
3.NT头
4.节区头(sectionHeader)

PE头中一些重要的信息

NT头:可选头(IMAGE_OPTIONAL_HEADER32)


1.AddressOfEntryPoint : EP的RVA值,程序最先执行的代码起始地址。
2.DataDirectory:IMAGE_DATA_DIRECTORY结构体数组

DataDirectory[0]:EXPORT Directory 导出表(EDT)的RVA地址
DataDirectory[1]:IMPORT Directory 导入表(IAT)的RVA地址
DataDirectory[9]:TLS Directory

IAT

IMAGE_IMPORT_DESCRIPTOR 结构体描述PE装载时的必须信息。每一个dll对应一个IMAGE_IMPORT_DESCRIPTOR 结构体,结构体的结构如下:

OriginalFirstThunk; //INT(Import Name Table) address(RVA)
TimeDateStamp;
ForwarderChain;
Name;//the name(string) of the dll
FirstThunk;//IAT(Import Address Table) address (RVA)

以装载kernel32.dll为例,PE装载器将导入函数输入至IAT的流程:

1.读取IID的Name,获取到库名称(“kernel32.dll”)
2.装载库(LoadLibrary(“kernel32.dll”))
3.读取IID的OriginalFirstThunk成员,获取INT地址
4.逐一读取INT中的函数名地址
5.通过函数名地址获取到函数名(eg.GetCurrentThreadId),获取函数的起始地址:GetProcAddress(“GetCurrentThreadId”)
6.读取IID的FirstThunk,获取IAT地址;
7.将函数地址填入到IAT项
8.重复4-7,直到INT结束

EAT

IMAGE_EXPORT_DIRECTORY 结构体描述PE文件的EAT信息,一个PE文件只包含一个IMAGE_EXPORT_DIRECTORY结构体。其结构如下:

NumberOfFunctions // Export函数的个数
NumberOfNames //Export函数中具名的函数个数
AddressOfFunctions // Export函数地址数组
AddressOfNames // 函数名称地址数组
AddressOfNameOrdinals // Ordinal地址数组

注:AddressOfFunctions与AddressOfNames的下标一般不互相对应, Ordinal地址数组是它们下标之间的映射。

你可能感兴趣的:(逆向工程)