脱壳小练习(一)

使用工具

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

操作流程

  1. 将 CM 导入 OD,使用内存访问法定位 OEP(这种方式设置的断点是一次性的):

    F2 断点

    原理是:加壳程序运行时,会依次解压各区段,所以,访问后会中断;

  2. 运行程序后,程序中断两次:

    第一次重点

    中断后查看提示信息,程序访问了代码段,所以触发了断点,再次运行程序:

    第二次中断

    程序再次中断,程序访问了第 2 个设置断点的区段,此时说明代码段已经解压完成了;

  3. 再次来到内存窗口,给代码段设置 F2 断点,然后运行程序:

    再次设置断点

    原理是:既然代码段已经解压完毕了,如果再次访问,就是原程序运行的时候;

    到达 OEP

    从模块中删除分析后,就可以看到程序的本来面目了;

  4. 然后打开 PETools,选择当前 CM 进程,右键菜单选择完整转存并保存到可执行文件:

    PETools

  5. 回到 OD,定位到 IAT,查看 IAT 起始位置(RVA)及结束位置(RVA),计算 Size:

    定位到 IAT

    通过 GetVersion 函数的地址,定位到 IAT;

    计算 RVA

    通过计算得知:

    • OEP 的 RVA 为:271B0;
    • IAT 的 起始地址 RVA 为:60818;
    • IAT 的 Size 为:60F28 - 60818 = 710(Hex);
  6. 打开 ImportREC 填写相关选项并获取:

    填写选项

    获取完成后,检查获取的数据:

    检查

    手动或通过显示无效选项检查获取数据是否有效;

    确认无误后点击修复转存按钮,选择转存的程序,就完成修复了;

  7. 将修复后的程序导入 OD,查看 log 窗口:

    log

    没有异常,说明程序正常运行;

    然后定位到 IAT,随便选择一个函数,右键菜单查看可执行文件,到达函数 IMAGE_THUNK_DATA 结构体;

    查看可执行程序

    这里存放的是函数名字符串的 RVA,Ctrl + G跳转到 VA 查看函数名字符串;

    确认 IAT

    确认函数名和 IAT 显示的函数名一致,脱壳完成;