PE and IAT hook
PE
由于了解IAT,需要了解一点PE,这里把PE也给写了吧
PE文件种类:
OBJ文件不能执行,dll和sys文件需要调试器执行或者服务和程序加载执行
DOS签名和PE签名
PE文件大体分为:1.PE头、2.PE体
1.PE头
- DOS签名
- DOS存根
- NT头
- 一系列节区头
- .data(数据)
- .text(代码)
- .rsrc(资源)
2.PE体:一系列节区
名词介绍:
VA:virtual address 绝对虚拟内存地址
RVA:相对虚拟内存地址
VA = RVA + imageBase
DOS头结构体:唯一有用的就是e_magic和e_lfanew
其中e_magic就是Dos签名,e_lfanew就是NT头的偏移
DOS存根
Dos存根是兼容dos系统的一种产物,可有可无,内容可用xp内置debug查看
内容是一段汇编代码,在dos系统中执行
NT头
NT头结构体
签名不作介绍,文件头结构体:
Machine代表cpu类别
SizeOfOptionalHeader是表示可选头的大小
Characteristics表示文件是否是dll,是否可执行
NT可选头结构体:
NT可选头非常重要,它记录了很多重要的数据
ImageBase,是映像基址,映像指的是PE文件加载到内存的一种形态(我觉得更像是一种叫法),映像基址定义了文件加载进内存的基础地址
SectionAlignment, 节区对齐是文件在内存中的最小单位,文件在内存的大小应该是这个值的整数倍
FileAlignment, 文件对齐是文件在磁盘中的最小单位,文件在磁盘的大小应该是这个值的整数倍
Subsystem,子系统用来区分文件是sys驱动文件还是exe可执行文件
NumberOfRvaAndSizes , 记录DataDirectory数组的个数
DataDirectory:
节区头结构体:
这里的VirtualAddress是用RVA表示的
RAV to RAW
RAW就是文件中节区的偏移(非内存)
IAT导入地址表
映像导入描述结构体:
文件导入多少个库文件,就有多少个 image_import_descriptor结构体
==该结构体的地址保存在image_optional_header32.DataDirectory[1].VirtualAddress中==
INT结构体保存着Image_import_by_name的指针
结构图:
PE装载器将导入函数加载到IAT的顺序:
EAT
不想写了,和IAT差不多,一个导入一个导出
它的查找数据先是image_optional_header32.DataDirectory[0].VirtualAddress找到这个结构体,然后根据要找的函数名去AddressOfNames数组里面拿到下标,然后用下标再去Oridinal数组找,找到下标又去AddressOfFunction那里找函数地址
没有函数名直接用Ordinal查找,Ordinal数组存在的意义是我忘了。。反正就这样
IAT hook
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com