正文
基础PE内容总览
8.编写导入内容:库+函数
◆根据导入内容思考设计:实现弹框需要写入两项内容:1.库名(user32);2.函数名(MessageBoxA)。根据两个字符串的长度(+00结束符)找到最合适的位置并写入:
◆
文件偏移+0x30, dll名
:
"user32 ",7Byte
◆
文件偏移+0x0C, 函数名
:
"
MessageBoxA
",12Byte
写入库名和函数名
9.编写导入表项
◆导入表IMAGE_IMPORT_DESCRIPTOR 置于
0xB0处
,因为PE加载后,0xB0-0xC3处内存会被初始化为全0。
◆
文件偏移+0xBC
:DWORD Name→RVA指向dll名:
0x00000030
◆
文件偏移+0xC0
:DWORD FirstThunk→RVA指向IAT表:
0x0000009C
10.编写IAT表 IMAGE_THUNK_DATA32
◆
文件偏移+0x9C
,PIMAGE_IMPORT_BY_NAME AddressOfData→指向IMAGE_IMPORT_BY_NAME:
0x0000000A
◆
文件偏移+0xA0
,以全0作结尾项:
0x00000000
11.将导入表位置写入数据目录中
◆
文件偏移+0x80
,DataDirectory[1]导入表位置:0x000000B0
◆OD检测:内存窗口中跟随地址0x40009C,以"长型→地址"方式查看,可见导入成功。
12.编写汇编指令:获取MessageBoxA函数地址并传参调用
◆
文件偏移+0x60
,在选项头的堆栈空间值区编写弹框文本:"hello world"
◆*选线头主版本号不可用,故以副链接器版本号成员处(0x1F)开始非重要区域编写指令:
◆
文件偏移+0x1F
,参数4 UINT uType→对话框按钮类型:6A 00 = push 0(注3)
◆
文件偏移+0x21
,参数3 LPCTSTR lpCaption→消息框标题:6A 00 = push 0
◆
文件偏移+0x23
,参数2 LPCTSTR lpText→消息框内容,指向"hello world":68 64004000 = push 00400064
◆
文件偏移+0x25
,参数1 HWND hWnd→窗口句柄:6A 00 = push 0
◆
文件偏移+0x2A
,短跳至空闲区以备调用函数:EB18= jmp short 00400044
◆
文件偏移+0x44
,从IAT表中获取API地址并调用:FF15 9C004000= CALL 0040009C
◆
文件偏移+0x4A
,调用后返回:C3=ret
14.修改OEP
◆
文件偏移+0x44
,OEP:FF15 9C004000= CALL 0040009C
15.完整PE总览
操作
修改导入表,导入表占 20字节 但前面 12个字节都没用
上述操作之后的代码
点击运行发现报错,说明我们的代码有问题
用OD 查看,发现导入函数并没有加载进来,说明我们的导入表构件的有问题
初步检查发现如下错误
继续寻找错误并把没用的数据用CC填充
还是有错误,继续寻找