文章作者:风泽 [E.S.T]
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
注意:本文章已经于去年发于《黑客手册》,如有转载请尊重版权,勿漏转文章作者,商业引用请与作者联系。
现在要找个没加壳的软件真是不容易啊,在第一篇鸟儿学破解中我提到的破解流程中就含有脱壳这一步,可是当时介绍的软件并没有使用加壳技术,所以就没介绍,今天我们小菜鸟来学习脱壳,这个可是个学习破解软件必备技术啊。
壳的概念:
在一些计算机软件里加入一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。大家就把这样的程序称为“壳”。
壳的分类:
1. 压缩壳
将软件体积减小。
2. 密码壳
在正常的软件中插入自己的代码,使得打开软件后需要输入密码才能运行。
3. 保护壳
一般我们称这类壳为猛壳,因为比较难对付,加壳后的程序一般体积会变大,也有部分壳可以起压缩作用。
了解了初步的知识后我们就来具体练习一下破解技术吧。
脱壳任务:
1. UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
2. JDPack 1.x / JDProtect 0.9 -> TLZJ18 Software
破解任务:
test for upx.exe
test for JDPack.exe
为了方便我自己写的,很容易就被破解的,今天主要是练习脱壳嘛~ [s:39]
拿出PEiD对test for upx.exe进行扫描,很清楚的就发现软件用UPX加了壳(其实是我自己加的,嘿嘿~~)
对于UPX这个壳网络上有很多脱壳软件,今天我们使用Quick Unpack 4.0 来脱掉它,打开软件选择test for upx.exe,然后点下面的“获取”按扭。
现在我们就可以点脱壳了,我们按照默认的文件名保存为unpacked.exe。
现在我们已经将软件的壳给脱掉,可是软件是不好运行的。没关系,我们现在使用软件将它的输入表修复一下。
打开LordPE,点击Rebuild PE后选择我们刚才脱过壳的unpackde.exe,软件就直接将输入表修复好了,双击unpackde.exe后程序正常运行。
现在我们使用W32dsm.exe打开软件,然后打开串式数据参考,我们就可以看到软件中的注册提示了。
双击注册成功后我们来到如下地方:
复制内容到剪贴板
代码:
:00402E1F E8F6020000 call 0040311A
:00402E24 50 push eax
:00402E25 E886030000 call 004031B0
:00402E2A 83C408 add esp, 00000008
:00402E2D 85C0 test eax, eax //比较注册码
:00402E2F 7416 je 00402E47
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DB8(U)
|
:00402E31 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"失败" //提示注册失败
|
:00402E33 6880444000 push 00404480
* Possible StringData Ref from Data Obj ->"注册失败"
|
:00402E38 6874444000 push 00404474
:00402E3D 8B4DF0 mov ecx, dword ptr [ebp-10]
:00402E40 E8E1020000 call 00403126
:00402E45 EB14 jmp 00402E5B
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402E2F(C) //很明显注册成功的提示是从00402E2F地址跳过来的
|
:00402E47 6A40 push 00000040
* Possible StringData Ref from Data Obj ->"恭喜!" //提示注册成功
|
:00402E49 686C444000 push 0040446C
* Possible StringData Ref from Data Obj ->"注册成功"
|
:00402E4E 6860444000 push 00404460
:00402E53 8B4DF0 mov ecx, dword ptr [ebp-10]
:00402E56 E8CB020000 call 00403126到这里就不要我说了吧,还不快使用UltraEdit将00402E2F的74改成75。在这次脱壳中我们都是使用的工具,简单、方便、快捷。可是有很多壳是没有现成的脱壳工具的,所以需要手工来脱壳,下面我们就来学习一下手工脱壳。
手工脱壳基本步骤:
1. 寻找OEP
2. DUMP文件
3. 修复输入表
我们用PeiD查到我们现在要脱的壳是铁甲。
网络上还没出现铁甲这个壳的脱壳机,所以我们只有手工来搞了,拿出我们菜鸟喜欢用的OllyDbg加载程序,忽略所有的异常。程序停留在0040A000处。
现在我们就按F8来调试,当程序运行到0040A04F的时候0040A058处就会改变成pushfd,我们直接单击此处,按F4 ,这个时候程序已经进行了第一次代码解密,我们继续用F8来向下走,一直来到第二个循环0040A0B1处。
这里是软件的第二次代码解密的地方,我们和上面一样,单击popad处按下F4,让程序直接解密,这个时候程序已经解密好了,现在我们就是要找OEP了,我们按下CTRL+F,调出查找命令对话框,将整个段块前面的钩去掉,输入popad来查找。经过6次的查找我们来到了如下地方
单击retn处,直接按F4来到这里,这个时候会弹出一个说JDPack没注册的对话框,不管它,直接点确定就可以了,再按一下F8,来到004031c0处。哈哈~~我们已经很接近成功了。现在程序在内存中已经完全解密好了。
现在我们就使用Ollydbg的DUMP插件来将软件DUMP出来。
我们现在只要点“脱壳之”的按扭就可以了。我将DUMP出来的软件保存为121.exe,我们单击他可以直接运行,其实到这里我们就可以结束了,可是我们3步中还有修复输入表却没做,虽然我们这个软件不需要修复就可以运行,但很多情况下是需要修复的,所以我在这里就继续的介绍一下修复的方法。
我们打开ImportREC.exe 在第一项中选取我们正用Ollydbg调试的test for JDPack.exe,现在我们来计算一下软件的OEP。
OEP=004031c0-00400000
所以我们就在OEP处填写000031C0 然后单击“IAT自动搜索”,再单击“获得输入信息”后我们会发现所有的函数都是有效的。
最后我们单击“修理抓取文件”按扭,选择我们刚才DUMP出来的121.exe就可以修复了。
到这里我们就完整了演示了一个手工脱壳的例子,我们就可以象上面例子一样继续破解了。
总结
如今在互连网上已经有很多种壳了,而脱壳软件却是少数的,这个意味着我们在以后的破解学习中会经常遇到需要自己手工脱壳的软件,所以掌握这门技巧是绝对关键的,要想运用自如,还需要各位破解爱好者多练习,多看一些大虾的脱壳手记以增加自己的经验。