《逆向工程核心原理》学习总结(四) - 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地址数组是它们下标之间的映射。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值