发新话题
打印

[原创]鸟儿学破解系列文章之二 软件脱壳打回原形

[原创]鸟儿学破解系列文章之二 软件脱壳打回原形

文章作者:风泽 [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就可以修复了。
  
到这里我们就完整了演示了一个手工脱壳的例子,我们就可以象上面例子一样继续破解了。

总结
如今在互连网上已经有很多种壳了,而脱壳软件却是少数的,这个意味着我们在以后的破解学习中会经常遇到需要自己手工脱壳的软件,所以掌握这门技巧是绝对关键的,要想运用自如,还需要各位破解爱好者多练习,多看一些大虾的脱壳手记以增加自己的经验。

附件

tools.rar (1.14 MB)

2006-9-24 12:03, 下载次数: 184

文章相关工具(OllyDbg和W32dasm就自己去下载吧)

http://hi.baidu.com/fengze

TOP

使用楼主提供的铁甲对test.exe进行加密,加密后运行失败,WINXP系统。

TOP

我这里重新加密也运行失败,文章是去年10月份的,忘记当时怎么成功了,没办法,找土豆哥要了以前加密好的程序,你们来练手吧。在这里特别感谢部分土豆进城大哥。。。谢谢~~辛苦了~~提前祝豆哥国庆快乐哈~~

附件

test for JDPack.rar (13 KB)

2006-9-25 22:02, 下载次数: 56

http://hi.baidu.com/fengze

TOP

另外还有个问题,用pediy上下的W32dsm8.9版,载入test.exe,串式参考,没有找到注册成功或是失败这样的字符,只有2个:"" "appmodul.cpp",用ollyice载入,查找所有字符参考,获得的信息也只有这两个,前面那个""是unicode "=::=::\"
跟着帖子里的描述,直接走到注册码比对的程序段,一个疑问兴起:“没有字符串参考,我怎么能判断这里就是比对程序?”
诶,给一个依葫芦画瓢的机会吧。。。

TOP

感谢风泽立马提供的test for JDPack.rar ,能够使我一步步参照着进行了一次脱壳和修复输入表。
知道得越多,疑问也越多。
对于解密好的程序,要找oep,这里是查找popad,6次查找后找到的入口,为什么是6次呢,此处的代码有什么特殊?

TOP

这里的6次是我们跟踪程序中按键的次数没什么特殊,主要是在跟踪后我们要让被加壳的程序解密出来,这样我们才可以使用工具dump.
http://hi.baidu.com/fengze

TOP

铁甲

看了下截图~~
应该能用ESP速脱吧
玩世不恭彼此 ⌒ ˇ互相鼓励信任 認眞體驗每⒈兲.!﹏演藝⒉.個亾啲莞鎂傳奇( [淇]儭滗.

TOP

引用:
这里是引用第[5 楼]testplay2006-09-25 22:26发表的:
感谢风泽立马提供的test for JDPack.rar ,能够使我一步步参照着进行了一次脱壳和修复输入表。
知道得越多,疑问也越多。
对于解密好的程序,要找oep,这里是查找popad,6次查找后找到的入口,为什么是6次呢,此处的代码有什么特殊?
=.=@找OEP
多脱了,你就会发现了
不是敷衍你,当初我也问过和你一样的问题
也有人是这么回答我的
现在我也这么告诉你

至于偷懒的办法

peid的插件

脱壳困难的是修复 [s:58]
玩世不恭彼此 ⌒ ˇ互相鼓励信任 認眞體驗每⒈兲.!﹏演藝⒉.個亾啲莞鎂傳奇( [淇]儭滗.

TOP

下载提示找不到:MFC42D.Dll文件~

TOP

谢谢,学这类问题最怕的就是解释多,实践少,没法快速积累经验, .
虽然晚了一年多,但是对我的学习有很大帮助,谢谢

TOP

发新话题