修复 IAT 之剔除无用数据
使用工具
- OllyDbg 1.10原版,简称
OD
; OD
汉化
和插件
均来自互联网;- UnPackMe来自互联网,仅供学习使用;
- Dump 工具为 OD 插件 OllyDump,来自互联网;
- IAT 重建工具为 ImportREC,来自互联网;
- 文中特殊数字均是
HEX
,为了书写方便采用DEC
;
操作流程
Import REConstructor(简称 ImportREC)是目前最好用的输入表重建工具,它可以从杂乱的 IAT 中重建一个输入表;
要运行 ImportREC,必须满足以下条件:
- 目标文件已完全被 Dump 并保存为另外一个文件;
- 目标文件必须正在运行;
- 事先找到目标程序真正的 OEP 或知晓 IAT 的偏移量和大小;
将 CM 导入 OD,使用栈平衡法找到 OEP,并停留在 OEP(目标文件必须正在运行);
使用 OllyDump 将内存数据 Dump 出来并保存至可执行文件(目标文件已完全被 Dump 并保存为另外一个文件):
在插件菜单选择 OllyDump 或右键菜单选择转存调试的进程都可以,然后确认 Dump 选项:
插件 Dump 数据方面没有问题,但重建 IAT 功能不够强大,因此,取消勾选重建输入表选项;
在 OD 中定位到 IAT,查看起始 RVA 以及结束 RVA,计算 Size:
在输入表中,一个 DLl 对应于一份 IAT,多个 IAT 之间一般以一个 DWORD 的 0 隔开;
此处 CM 的 IAT 之间被添加了无效信息;
用 ImportREC 打开 CM 进程,填写 OEP(RVA)以及 IAT 的起始地址(RVA)和大小,然后点击获取:
获取输入表后,可以看到有一组
valid:NO
的数据,这就是两个 IAT 之间的无效信息:确认是无效信息后,在无效信息上右键菜单执行“Cut thunk(s)”命令:
剔除无效信息后,数据还是不正确:
因为 CM 中调用了 3 个 DLL,分别是 user32.dll、kernel32.dll 以及 ntdll.dll;
而 ImportREC 只找到了两个,看来这玩意儿也不好使啊;
NoNoNo,它找到了三个,但因为 ntdll 中的 API 混合在 kernel32 的 API 中,所以被替换了,看 log 窗口的提示信息;
此时如果直接修复 dump.exe,在当前环境(xp)下是可以运行的,但可能会在其它 OS 中遇到兼容性问题;
所以还需要修复 API:
在获取的信息中,双击对应的 API,在弹出的函数编辑框中修改对应的 DLL 名称和 API 名称;
- 查看 RVA 来获取对应的函数比较直观,如:00001200 和 00001210;
- 双击函数行打开函数编辑框;
- 在编辑框中首先选择 DLL 名称,然后可以在下面的输入框中搜索指定的函数名,接着选择函数,点击 OK 确认修改;
- 修改完成后,依然显示的是未修改的状态,但修复程序后,显示已修改;
修改完成后,点击
Fix Dump
,选择需要修复的程序,完成修复: