脱壳小练习(二)
使用工具
- OllyDbg修改版,简称
OD; OD汉化和插件均来自互联网;- UnPackMe来自互联网,仅供学习使用;
- Dump 工具为 PETools,来自互联网;
- IAT 重建工具为 ImportREC,来自互联网;
- 文中特殊数字均是
HEX,为了书写方便采用DEC;
操作流程
将 CM 导入 OD,在尝试了
内存访问法和栈平衡法都不能到达 OEP 后,使用 SPOD(Special OD,个人称呼)配合常用函数法最终到达 OEP;将 CM 导入 SPOD,goto 到 GetProcAddress 函数的行首,设置条件记录断点,记录调用 GetProcAddress 函数的地址及参数:
![条件记录断点]()
清空 log,然后运行程序;
打开 log 窗口,对比各区段偏移后,发现外壳最后一次调用 GetProcAddress 函数的地址为 00478095:
![最后一次调用]()
重载程序,修改条件记录断点为条件断点:
![条件断点]()
然后运行程序;
程序中断后,给代码段设置内存执行断点,取消其它断点,运行程序;
![删除模块分析]()
删除模块分析后,确认程序到达 OEP;
![IAT]()
跟随任意 CALL,确认有调用输入函数后,继续跟随即可定位 IAT,此处为间接调用;
查看 IAT 的起始地址和结束地址,计算 Size;
OEP 的 RVA 为:40300;
IAT 的起始地址 RVA 为:430F0;
IAT 的结束地址 RVA 为:43674;
IAT 的 Size = 43674 - 430F0 = 584;![计算 RVA]()
使用 PETools 将内存数据 Dump 并保存为可执行文件;
打开 ImportREC,填写相关选项,然后获取输入表:
![ImportREC]()
检查没有无效信息,修复程序;
程序可以运行,将程序导入 OD,检查 IAT:
![检查 IAT]()
检查任意函数的名称字符串:
![函数的名称字符串]()
都没有问题,脱壳完成!








