壳的作用无非两种,一个是压缩减小软件体积,另一个是加密阻止软件被逆向破解。既然有了加壳脱壳自然而然就产生了。
这里提醒下几个主要的概念:
OEP:Original Entry Point 就是源程序真正入口点,加壳目的就是为了隐藏它
Dump:就是转存,在加壳程序中找到入口点,将内存中进程数据保存到硬盘里(普遍用的都是LordPE工具)
IAT:Import Address Table 就是导入函数的地址表,这段地址存放的就是源程序的API函数地址(通常使用ImportRce修复脱壳时的地址表)
ESP定位的脱壳方法是应用比较普遍也是应用比较广的一种脱壳方法,它是利用堆栈平衡的原理查找OEP,因为有壳的程序加壳的时候需要先入栈保存原环境各寄存器的值,外壳执行完毕就需要出栈恢复原环境数据。脱壳就是利用这个对ESP设断
ESP定位脱壳该方法大致流程:找到程序真正的入口点——LordPE工具脱壳转存文件——同时应用ImportRce工具去修复脱壳后被破坏的IAT表
下面展示下对RebPE.exe的脱壳方法流程:
- 定位OEP
将程序拖入Ollydbg中可以看到这里pushad指令后续指令都不是一个正常源程序所拥有的,很明显这里的pushad指令是运行程序的壳前,将程序真正开始执行的环境进行入栈保存
F8单步执行一步,这个时候程序环境参数入栈保存,可以看到右边寄存器窗口只有ESP和EIP的值变红,这说明只有它们两的数据发生改变,因为它们是段地址+偏移地址用来确认栈顶指针,可以看到右下栈数据窗口存储的就是之前我们图一的各个寄存器的值,可以看到ESP的值由原来的19ff84变为19ff64。
对ESP现有的19ff64设置硬件断点,下硬件断点是在做下的数据窗口中设置,首先在寄存器窗口选中ESP寄存器地址右键选择数据窗口中跟随,这个时候可以看到数据窗口中的地址发生改变变成19ff64地址段,也就是现在的ESP地址段,选中两个字节下word硬件断点
下完硬件断点后,可以在调试——硬件断点中查看,然后F9一键运行程序,会停在一个push指令上,看它的上一条指令popad即恢复源程序环境指令。到这里也就说明它的壳环境执行完毕,OEP的位置也就不远了。
单步执行retn后,跳转程序入口点401130位置,确认OEP的位置,这里有时候并未被识别出代码,显示出一段db定义字节数据,Ctrl+A分析一下即可。
2.脱壳
Olldbg汇编指令运行到OEP位置处,打开LordPE工具,选中脱壳程序RebPE.exe右击纠正镜像大小(防止误读),再次右击选择完全脱壳,转存为lord.exe
3.修复
此时利用LordPE脱壳后的程序,它的原始IAT也就是导入函数地址表并没有恢复,打开ImportRCE工具,选择带壳程序进程rebpe.exe,刚加载该程序进程的时候,它的OEP并不准确,将程序的实际OEP地址填进去(这里填写相对地址1130不是401130),点击自动查找IAT,弹出提示消息可能发现原始IAT地址,点击确定。
再次点击获取输入表按钮,这里显示的都是有效函数(如果有无效函数,先修复,再右击选择剪切指针剪切掉),点击修复转存下来的文件lord.exe变成了lord_.exe文件,点击文件可以正常运行,而用LordPE脱壳下来未修复文件lord.exe不能运行。
将lord_.exe文件拖入ollydbg可以看到首个汇编指令即程序的真正入口点位置地址:00401130,成功脱壳!
源程序及工具:链接: https://pan.baidu.com/s/1KxPo6l-H3kHCtaZcDZ3txQ 提取码: u2yd
参考链接———段刚: 《加密与解密》