脱壳小练习(二)

使用工具

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

操作流程

  1. 将 CM 导入 OD,在尝试了内存访问法栈平衡法都不能到达 OEP 后,使用 SPOD(Special OD,个人称呼)配合常用函数法最终到达 OEP;

  2. 将 CM 导入 SPOD,goto 到 GetProcAddress 函数的行首,设置条件记录断点,记录调用 GetProcAddress 函数的地址及参数:

    条件记录断点

    清空 log,然后运行程序;

  3. 打开 log 窗口,对比各区段偏移后,发现外壳最后一次调用 GetProcAddress 函数的地址为 00478095:

    最后一次调用

    重载程序,修改条件记录断点为条件断点:

    条件断点

    然后运行程序;

  4. 程序中断后,给代码段设置内存执行断点,取消其它断点,运行程序;

    删除模块分析

    删除模块分析后,确认程序到达 OEP;

    IAT

    跟随任意 CALL,确认有调用输入函数后,继续跟随即可定位 IAT,此处为间接调用;

  5. 查看 IAT 的起始地址和结束地址,计算 Size;

    OEP 的 RVA 为:40300;
    IAT 的起始地址 RVA 为:430F0;
    IAT 的结束地址 RVA 为:43674;
    IAT 的 Size = 43674 - 430F0 = 584;

    计算 RVA

  6. 使用 PETools 将内存数据 Dump 并保存为可执行文件;

  7. 打开 ImportREC,填写相关选项,然后获取输入表:

    ImportREC

    检查没有无效信息,修复程序;

  8. 程序可以运行,将程序导入 OD,检查 IAT:

    检查 IAT

    检查任意函数的名称字符串:

    函数的名称字符串

    都没有问题,脱壳完成!