修复 IAT 之剔除无用数据

使用工具

  • OllyDbg 1.10原版,简称OD
  • OD 汉化插件均来自互联网;
  • UnPackMe来自互联网,仅供学习使用;
  • Dump 工具为 OD 插件 OllyDump,来自互联网;
  • IAT 重建工具为 ImportREC,来自互联网;
  • 文中特殊数字均是HEX,为了书写方便采用DEC

操作流程

Import REConstructor(简称 ImportREC)是目前最好用的输入表重建工具,它可以从杂乱的 IAT 中重建一个输入表;

要运行 ImportREC,必须满足以下条件:

  • 目标文件已完全被 Dump 并保存为另外一个文件;
  • 目标文件必须正在运行;
  • 事先找到目标程序真正的 OEP 或知晓 IAT 的偏移量和大小;
  1. 将 CM 导入 OD,使用栈平衡法找到 OEP,并停留在 OEP(目标文件必须正在运行);

  2. 使用 OllyDump 将内存数据 Dump 出来并保存至可执行文件(目标文件已完全被 Dump 并保存为另外一个文件):

    OllyDump

    在插件菜单选择 OllyDump 或右键菜单选择转存调试的进程都可以,然后确认 Dump 选项:

    Dump

    插件 Dump 数据方面没有问题,但重建 IAT 功能不够强大,因此,取消勾选重建输入表选项;

  3. 在 OD 中定位到 IAT,查看起始 RVA 以及结束 RVA,计算 Size:

    Size

    在输入表中,一个 DLl 对应于一份 IAT,多个 IAT 之间一般以一个 DWORD 的 0 隔开;

    此处 CM 的 IAT 之间被添加了无效信息;

  4. 用 ImportREC 打开 CM 进程,填写 OEP(RVA)以及 IAT 的起始地址(RVA)和大小,然后点击获取:

    ImportREC

    获取输入表后,可以看到有一组valid:NO的数据,这就是两个 IAT 之间的无效信息:

    确认是无效信息后,在无效信息上右键菜单执行“Cut thunk(s)”命令:

    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,选择需要修复的程序,完成修复:

    完成修复