PE结构分析之手工修复导入表
打开文件,发现打不开
用 winhex 打开,看一下代码节,在2000处与2008处调用了函数
用 Stud_PE 打开
在区段选项中的 .rdata 处右键,选择转到区段初始
可以看到导入表全是0,就是这里的原因使得无法正常打开,要想打开,我们需要修复导入表
我们可以看一下RVA <=> RAW,2000对应的文件地址为600
在 winhex 中找到导入表的位置,看到有messagebox、user32.dll、exitprocess、kernel32.dll 等信息
前置知识:
INT能够表示出函数名是什么,IAT能够表示出这个函数的入口地址在哪里。
可是系统不知道那个结构是INT,IAT。这时候就用IID来描述。通过IID可以找到INT,IAT,以及调用的dll名称。
Pe文件加载的时候,先通过IID里面指向的INT表获取出该函数名,在dll中查找出来该函数的入口地址,然后填入IID里面指向的IAT表
019D是 messageboxA 的索引号,后面是他的字符串描述。两者合起来构成 IMAGE_IMPORT_BY_NAME 结构
可以看到 messagebox 位置是205C(RVA)
在 IAT 表600(RAW)位置填上205C,IAT 表中每4个字节表示函数名的 RVA。以4个0表示该 IAT 的结束
整理出各个函数及 DLL 的 RVA
这样把 IAT 表修复完成
下面需要完成 INT 表的建立。INT 表应该在 IID 之后,所以先确定 IID 的位置。IID 一共有3个,每个 IID 0x14 长度,3个加起来应该有 0x3c 长度
INT 表示函数调用结束使用4个0作为标志。因为指向的都是同一个地址,所以每个 INT 的值和对应的 IAT 的值是一样的,下面把 INT 表修复完成
下面来完成 IID,先来完成第一个关于 messagebox 的 IID。第一个4字节,是关于调用的 messagebox 函数的 INT 地址,查看得到 messagebox 在 INT 表中的位置:204C。后面两个4字节全填0。第四个4字节是 user32.dll 的RVA,查看得到:206A,最后一个4字节是 messagebox 的 IAT 地址:2000
完成所有修复后结果:
已经可以打开了: