所谓壳,就是保护果实的俗称,加壳技术其意义在保护,就是让分析着或者工具看不到程序或者代码段的真实内容,将内容保护起来的一种手段,常见的壳基本分为三种:压缩壳,加密壳,虚拟壳,还有不常见的捆绑壳。
想脱壳首先要知道对方采用了什么样的壳,最常见的方法利用节查看器,正常的程序应当如下所示。
如果出现了其他区段,那么程序或者代码就有可能被加了壳,
这里推荐两款工具,一款是PEID和DIE,我个人更喜欢DIE,新版的DIE记录了更多壳的信息,信息也更加准确,PEID相对的插件更多,也是大家耳熟能详的工具。
压缩壳以UPX为代表,此类壳的功能已压缩为主,对文件的加密效果几乎没有,侦壳工具可以轻而易举地发现这些壳,也有较成熟的脱壳机来实现。所以当文件有较高的存储性能要求,且代码保密程度是可以开源时,才比较适合使用此类壳处理。
https://github.com/upx/upx/releases
使用方法也很简单:upx -d 即可一键脱壳
常见的加密壳有ASProtect和Armadillo穿山甲,加密效果较强,但就像密码一样,没有破解不了的密码也没有脱不掉的壳,目前针对ASProtect好像已经有了可用的脱壳机,但一般通用的脱壳方法如下:
1.用OD打开程序,点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序.
2.按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数n.
3.重载程序,再按SHIFT+F9,这次按的次数为上次让程序运行时的次数的n-1次.
4.此时观察OD的右下角有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!来到这个地址.
5.在这里,按F2下断点!然后按SHIFT+F9来到断点处!
6.这时候我们已经跳过了所有异常,然后去掉断点,按F8慢慢向下跟踪很快就到达OEP了.
虚拟技术应用到壳的领域,设计了一套虚拟机引擎,将原始的汇编代码转译成虚拟机指令,要理解原始的汇编代码,就必须对其虚拟机引擎进行研究,此壳可以说是现在市面上最难脱的壳,因为不容易拖干净,很少有完美脱壳的办法,但是壳总有能脱的方法,这里用简单1.6x来举例:
可以看到虚拟壳最基本的特征就是增加vmp的区段
打开od对od调试选项进行设设置:
然后运行程序ctrl+G用到一个断点:virtualProtectEx 下断点,然后查看区段,text到vmp1以后有6个区段所有下完断点后运行6次
运行到第六次后查看Address返回地址,然后在text设置内存访问断点,运行后我们就跑出了虚拟机,如果出现乱码ctrl+a分析下代码,ctrl+D FF 25 然后删除分析代码 到OEP
通过ctrl+d 寻找相应编程的push 例如VB 就push vb5 或者 vb6
总的来说脱壳都是遵循一定的定律
最常用的就是堆栈平衡(esp):
用压缩壳举例,在运行程序以前,先运行了压缩壳,而压缩壳也可以看作是一个段子程序,调用这个子程序就需要入栈操作,汇编语言中称作PUSH,调用栈在程序结束后,为了清空栈内数据,和返回调用程序所压入的地址,所以要出栈,简称POP
具体操作如下:
1开始就点 F8,注意观察 OD 右上角的寄存器中 ESP 有没有变成红色(这只是一般情况下,更确切的说我们选择的 ESP 值是关键句之后的第一个 ESP 值)
2.在命令行下:dd XXXXXXXX(指在当前代码中的 ESP 地址,或者是 hr XXXXXXXX),按回车
3.选中下断的地址,断点>硬件访问>WORD 断点.
4.按一下 F9 运行程序,直接来到了跳转处,按下 F8,到达程序 OEP.
当然这只是其中的一种:
单步跟踪法,内存镜像法,命令查找法,末次异常法,通常在实战中这些方法都是综合起来使用。
逆向的学问太多了,能讲的很多,更多其实就是慢慢尝试,总结逆向的需要学习的就是,语言,调试,还有一定的分析。
商务咨询:
0571-87031601
商务邮箱: