修复 IAT 之初探

之前尝试了手动修复 IAT,了解修复的原理后,本次记录使用工具修复的过程;

使用工具

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

操作流程

  1. 使用 UPX 加密 CM,然后导入 OD;

  2. 使用栈平衡法定位并跳转至 OEP,接下来在操作过程中不能关闭 OD 且程序需停留在 OEP 位置;

  3. 打开 PETools,将内存数据 Dump 出来并保存至可执行文件:

    PETools

    默认保存为 dumped.exe;

  4. 打开 ImportREC 选择 CM 进程:

    选择 CM 进程

    选择后,日志窗口会提示关联模块获取完成:

    关联模块获取

    然后在下方填写 dumped.exe 程序 OEP 的 RVA,以及 IAT 的起始位置(RVA)和尺寸:

    计算 RVA

    根据 VA 和 RVA 的转换公式计算如下(注意都是 16 进制哦):

    OEP 的 RVA = 401000 - 400000 = 1000;

    IAT 的 RVA = 403184 - 400000 = 3184;

    IAT 的 Size = 40328C - 403184 = 108;

    填写 ImportREC 的选项:

    填写 ImportREC

    然后点击Get Imports,开始获取输入表的内容:

    获取内容

    获取完成后,需要检查获取的数据是否有效,如果 valid 为 NO,需要手动检查是否为无用信息,否则需要修正后重新获取(当前不涉及重定向);

    接着点击Fix Dump选项,在弹出窗口选择 dumped.exe,用于修复;

  5. 修复后的程序可以正常运行,但导入 OD 后依然会提示入口点超出代码段范围:

    入口点超出代码段范围

    修改代码段的起始地址(RVA)即可:

    修改代码段的起始地址

    然后选中修改并保存到可执行文件,完工!