在做PE文件二次开发时常常需要手工添加导入函数,例如程序导入了7个dll文件(如下图),每个导入的dll有一个对应的IID:
其中前三个dll是程序隐式调用的,编译时会自动添加IID数组中,PE头中的数据目录项有一个AddressOfImport字段指向该数组的首地址,数组以一个全零的IID结束; 后面五个dll是手工添加进去的(可以借助LordPE工具添加),通过FirstTrunk可以看到这里的IID不是连续存放的,这就导致通过PE头找不到完整的IAT列表.
修复办法如下:
1.查找iat函数:
用ImportRec打开程序,手工输入每个IAT的RVA值和长度,(长度计算方法: [长度] = [IAT最后一个函数的RVA]- [第一个函数的RVA] + 4),点击获取输入列表,ImportRec会将找到的函数显示上列表中,对每个IAT进行同样的操作.
2.重建iat
在ImportRec的选项中设置"创建新的IAT",然后点击主窗口的"修复转储文件",对dump文件进行修复即可.这是修复后的效果: