实现64位与32位的PELoader
结合了前文PE文件格式的知识就可以做出一个简易的PE加载器(就是模拟了启动.exe这个过程)
实现了32与64位不同情况下的PELoader
步骤
节区表扩展
节区表在PE头NT之后,结构如下
1 | typedef struct _IMAGE_SECTION_HEADER { |
取真实偏移扩展到RVA就行
节区表个数在NT头下的FileHeader中
修复重定位表
重定位表在NT头中
OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]
结构如下
1 | typedef struct _IMAGE_DATA_DIRECTORY { |
重定位表由n个 一个开头和开头中声明的后续 组成
- 开头部分声明当前部分的基地址与大小
- 后续部分以WORD定义,具体如下
高4位代表重定位类型,低12位代表重定位地址,这里的重定位地址的真实地址需要+开头部分定义的基地址
注意这里开头部分基地址+后续部分重定位地址=磁盘偏移
运行时扩展地址=磁盘偏移-磁盘开头偏移+真实开头偏移
修复导入表
导入表如重定位表 也在DataDirectory中 结构一致
如下是导入表的结构
1 | typedef struct _IMAGE_IMPORT_DESCRIPTOR { |
导入表也是数组存储,需要改变的是FirstThunk(IAT表),通过OriginalFirstThunk(INT表)中的信息查找dll返回值改变IAT表,IAT与INT表中结构如下
1 | typedef struct _IMAGE_THUNK_DATA32 { |
源码
1 |
|