解密入门教学(五)--爆破软件
爆破的原理我也说过了,相信你很容易就能理解了。我们今天就具体讲一下如何找到那个关键跳转以及如何才能买到即便宜又好用的雷管。
爆破一个软件一般只需要很少的几个步骤。
首先先看一下其有无加壳,有的话是用何工具加的壳,知道了以后用相应的工具将其脱掉或进行手工脱壳,参考己有教程。接着我们就可以对脱过壳之后的软件来开刀了。你有两种选择,用 W32Dasm 或调试器,一般如果你遇上的是那种很菜的软件的话,用 W32Dasm 就可以搞定了。如果遇上的不是那种比较菜的,就买股票吧,因为股票是你如胶似漆的妻子!当!快醒醒啊...哦,一般如果你遇上的不是那种很菜的软件的话,就用调试器吧。先来说 W32Dasm:我们首先用 W32Dasm 来进行反汇编(废话!)之后在串式参考中找到错误提示信息或可能是正确的提示信息双击鼠标左键来到相应的地址处。在 W32Dasm 的主窗口中分析相应汇编代码,找出关键跳转和关键 call。绿色光条停在关键跳转,在 W32Dasm 主窗口底部找到关键跳转的偏移地址(实际修改地址)。用ultraedit找到偏移地址(实际修改地址)修改机器码(或放上一根雷管),保存(点火)!而用调试器也同样简单,等会儿会详细说明。
道理说了那么多,来实例动手说明吧:
xxxxZip是一款压缩、解压各种压缩文档的工具软件,它支持包括ZIP格式文件在内的各种常见压缩格式如:ARJ、CAB、GZIP、JAR、LHA、TAR、ZOO、ARC、LZH、Pak等等。
首先第一步是你得把它装上(引来野狼N头),之后先随便找个字符串填上去注册一下,会看到一个错误对话框,提示"注册码不正确,无法注册"。接着我们用FI来看一下它用的是什么壳。ASPack 2.001,caspr出场。脱过壳后我们用W32Dasm花上半分钟或半小时的时间来对它进行反汇编。我们以经反汇编完毕。之后在串式参考中(字符串数据参考)中找刚才你看到的那个错误提示,找到之后双击几次,发现其只有一处调用。我们会来到004F0E64处,我把具体代码给贴上(请你从代码的最下边开始看):
我再给你讲一遍好了,通常我们会遇到两种关键跳转,我分别举例说明:
(1)
je (jne,jz,jnz) 19870219
........ XXXXXXXXXX
........ XXXXXXXXXX
........ 软件注册正确的相关信息
...
...
19870219 软件的出错信息
.......
.......
也就是说这第一种情况是先判断注册码是否正确,如果不正确就跳到19870219处,正确的话就不跳转,一直执行下去,直至注册正确处。
对于这种情况,我们要找的关键跳转,就是正确信息上面的第一个跳转。我们可能对其作相应修改或将其给nop掉就万事OK了。
(2)
je (jne,jz,jnz) 19870219
........ XXXXXXXXXX
........ XXXXXXXXXX
........ 软件的出错信息
...
...
19870219 软件注册正确的相关信息
.......
.......
而这第二种情况就是先判断注册码正确与否,如果正确就跳到19870219处,不正确的话就不跳转,一直执行下去,直至出错处。
对于这种情况,我们要找的关键跳转就是出错信息上面的第一个跳转。将其做相应修改或改为jmp后我们就可以为所欲为了
道理讲明白了,我们来改一下试试吧。我们在 W32Dasm 中选中关键跳转,在右下角的状态栏中看到相应的偏移地址为 000F41EC。好的,我们用 UltraEdit 来打开它。Ctrl+G,接着输入0xF41EC,回车后便会跳到相应的位置。相应的机器码是75(jne),我们将其改为74(jz)后存盘退出。
好了,运行一下看看,我们来随便输入一个注册码注册一下试试。
注册成功!
用 W32Dasm 我们就讲到这里,你下去之后自己找些保护简单的软件上上手吧。
我们接着来讲用调试器来进行爆破。
如果你真的试图用 W32Dasm 去爆破几个软件的话,用不了多少时间你就会发现一些问题。比如说有的软件你用 W32Dasm 反汇编后串式参考根本就不能用。或者串式参考中没有出错或正确的信息。还有就是有的软件就算你通过串式参考来到了相应的地方,刚想去找关键跳转你就会发现眼前的东西比你想像中的要乱的多...虽然你有可能通过认真仔细地找,仍会找到,但我不认为那是一件聪明的事情。毕竟,有一些动静是只有在程序执行期间才能看出来的。好的,如果你用 W32Dasm 遇到了找不到关键跳转的软件,就去用调试器吧!(你用调试器前可先用 W32Dasm 打开一遍看个先,如果很容易就让你找到了。那就没必要了)
在开始之前我们有必要讲一下用调试器来爆破的步骤(我知道你一定会用调试器的 ):首先,我们当然还是要把你要 Crack 的软件给装上(我挡我挡我挡,不要乱丢东西嘛!)然后来到输入注册码的地方,仍旧随便输入一个,接着不要按确定,待我们把调试器叫出来先。还记的我前面跟你讲的API的事情吗?软件要得到你输入的注册码,就一定会调用某个 API 函数来达到目的。我们就在调试器中用相应的 API 来做断点,这样的话,只要一有程序调用这个 API,就会被调试器给拦截下来。GetDlgItemInt、GetDlgItemText、GetDlgItemTextA这三个函数可能会有用。
你应该明白,程序是很灵活的东西,并没有那么多公式化的东西在里边,大概的分析方法就是这个样子,一切都要靠你自己去掌握,别人跟你讲,也只是讲一个分析的方法而以,我相信随着你以后经验的提高,你慢慢地就能应付各种情况了。
现在,我们再用调试器来对****ZIP这个软件进行分析,希望你能够掌握这个并不难的方法。
首先,你要把刚才爆破过了的再改回来,或直接重装一遍。之后我们打开它,任意输入注册码,设置断点。好的,程序被断了下来:
0167:00436d13 mov [ebx+0c],eax
0167:00436d16 mov eax,[ebx]
0167:00436d18 cmp eax,byte +0c
0167:00436d1b jnz 00436d38
0167:00436d1d mov edx,[ebx+08]
0167:00436d20 push edx
0167:00436d21 mov ecx,[ebx+04]
0167:00436d24 mov edx,eax
0167:00436d26 mov eax,esi
0167:00436d28 call 00432b24
……N多代码仍旧省略……
按 F8 来到 0167:004f4dc4 处,我们接着一下一下来按F8,大概按了10多下,就可以看到 004f4dec 处有一个跳转,我们执行到 004f4dec 处后果然跳走了。会跳到 004f4e64 处,我们跳过去之后按不了三下,程序就提示出错了。明白过来了吧,004f4dec 处的那个跳转 jnz 004f4e64 就是关键跳转,嘿嘿,找到了之后不用我说了吧
0167:004f4dc4 mov eax,[ebp-08]
0167:004f4dc7 push eax
0167:004f4dc8 lea edx,[ebp-10]
0167:004f4dcb mov eax,[ebx+02e0]
0167:004f4dd1 call 00432f24
0167:004f4dd6 mov edx,[ebp-10]
0167:004f4dd9 lea ecx,[ebp-0c]
0167:004f4ddc mov eax,ebx
0167:004f4dde call 004f4fac
0167:004f4de3 mov edx,[ebp-0c]
0167:004f4de6 pop eax
0167:004f4de7 call 0040411c
0167:004f4dec jnz 004f4e64 <--关键跳转!!
0167:004f4dee mov dl,01
0167:004f4df0 mov eax,[00452558]
0167:004f4df5 call 00452658
0167:004f4dfa mov [ebp-04],eax
0167:004f4dfd xor eax,eax
0167:004f4dff push ebp
0167:004f4e00 push dword 004f4e5d
0167:004f4e05 push dword [fs:eax]
0167:004f4e08 mov [fs:eax],esp
0167:004f4e0b mov cl,01
0167:004f4e0d mov edx,004f4ea8
0167:004f4e12 mov eax,[ebp-04]
0167:004f4e15 call 0045283c
0167:004f4e1a mov ecx,004f4ecc
0167:004f4e1f mov edx,004f4ef4
0167:004f4e24 mov eax,[ebp-04]
0167:004f4e27 call 00452c80
0167:004f4e2c mov eax,004f4f00
0167:004f4e31 call 00458b8c
0167:004f4e36 mov eax,[0050306c]
0167:004f4e3b mov eax,[eax]
0167:004f4e3d mov edx,004f4f24
0167:004f4e42 call 00432f54
0167:004f4e47 xor eax,eax
0167:004f4e49 pop edx
0167:004f4e4a pop ecx
0167:004f4e4b pop ecx
0167:004f4e4c mov [fs:eax],edx
0167:004f4e4f push dword 004f4e6e
0167:004f4e54 mov eax,[ebp-04]
0167:004f4e57 call 004030c4
0167:004f4e5c ret
0167:004f4e5d jmp 00403824
0167:004f4e62 jmp short 004f4e54
0167:004f4e64 mov eax,004f4f48 <---由上面的0167:004f4dec处跳来,出错!;
0167:004f4e69 call 00458b8c
0167:004f4e6e xor eax,eax
呵呵,最后还是要说一句,爆破只是一些雕虫小技。刚入门时玩几次就够了,切莫就此不前...
后话:你可能慢慢就会发现,有一些软件其实并没有你想象中那么简单,你甚至连找到它的关键跳转都找不到。这很正常,你要做的便是多动手多练习,慢慢你就会明白过来的。我今天之所以给你举这两个例子,就是因为它们两个都比较简单,且能说明重点,给你讲那些比较那个的软件的爆破,反而会让你看的一头雾水...
<本章完>
中国年
看 雪 学 院