从零开始学Crack:破解的三个阶段与关键技术
从本章起,我们将逐步探讨Crack软件的奥秘(或许80%的读者已经想逃,剩下20%正在寻找可以扔过来的东西)。先别急着动手,让我们一起梳理学习破解的三大阶段:
- 初级:修改程序,例如使用UltraEdit等工具直接编辑exe文件,即暴力破解,俗称爆破。
- 中级:逆向分析并提取软件的注册码。
- 高级:编写注册机程序。
首先聊聊爆破。所谓爆破,就是通过修改可执行文件的源代码来达成目标。不理解?举个例子:某共享软件会比对用户输入的注册码与它根据用户名计算出的正确注册码。如果两者相等,程序就跳转到注册成功的位置;否则跳转到错误提示处。关键就在这里——我们只需要找到那个跳转指令,将其改成我们想要的形态,是不是就能随心所欲了?(某软件双手护胸:你要干嘛?)
常见的修改方法有两种,直接看实例。
第一种情况
在某个软件中,注册验证的逻辑如下:
00451239 CALL 00405E02 (关键CALL,判断用户输入的注册码是否正确)
0045123D JZ 004572E6 (如果正确则跳转到成功处)
看清楚了吗?我们只需要把关键跳转 JZ 改成 JNZ,结果就会反转:输入错误的注册码反而成功,正确的却失败。当然你也可以改成 JMP,那样无论输入什么都能成功。
第二种情况
再看另一个常见模式:
00451239 CALL 00405E02 (关键CALL,判断用户输入的注册码是否正确)
0045123D JNZ 004572E6 (如果不正确则跳转到失败处)
看出区别了吧?第一种是正确时跳转到成功,没跳转则执行失败;第二种是不正确时跳转到失败,没跳转则执行成功。针对第二种,我们可以把 JNZ 改成 JZ,或者干脆改成 NOP——NOP 是空指令,没有任何作用,改完后就可以随意输入注册码了。
原理讲完,接下来该说说具体怎么改了(假设你已经会用那些工具了)。
先搞清楚一个概念:虚拟地址和偏移量。在SoftICE或W32Dasm里看到的地址是内存地址(虚拟地址,VA),而在Hiew、Hex Workshop这类十六进制工具里显示的地址是文件地址(偏移量,File Offset / RAW Offset)。所以要用十六进制工具改文件,得先找到对应的偏移量。不用专门转换工具,W32Dasm直接帮你标出来了。比如你在W32Dasm里定位到 0045123D,界面下方的状态栏就会显示 @:0045123D @offset 0005063Dh,后面的 0005063Dh 就是偏移地址。拿到这个地址后,用UltraEdit打开exe文件,按 Ctrl+G 输入偏移地址,就能跳到对应的机器码位置。
再补一点机器码的知识。机器码就是那些十六进制数据,和汇编指令一一对应。爆破时常用的几个:
JZ = 74JNZ = 75JMP = EBNOP = 90
修改时直接替换对应的字节就行。比如第一种情况,把 74 改成 EB(JZ→JMP);第二种情况,把 75 改成 90(JNZ→NOP)。
本章只讲原理,至于怎么找到关键跳转,下一章细说(一个砖头飞上来——这次被我接住了)。爆破只是入门手段,刚接触时可以玩玩,但别止步于此。再说了,人家的软件里都写着“请勿逆向修改”,你动了人家的身子,总得付个账吧?
其实很多人不喜欢爆破,做不出注册机也要找出注册码,否则就不注册。不想掏钱,就靠本事。从某种意义上说,这也算一种正人君子。
找注册码并不难,前提是软件不太“硬”。刚才说爆破时提到了关键CALL,这个CALL通常就是对两个注册码进行比较:一个是软件算出来的正确注册码,另一个是你输入的错误码。CALL之前,软件会把两个码放到堆栈或寄存器里。我们只需要用调试器单步执行到CALL处,通过之前的指令判断它们放哪了,再用相应指令查看就行。听起来很容易吧?
最常见的两种模式如下(可参考相关教程详细学习):
模式一
mov eax [地址或寄存器] ; 存放正确码
mov edx [地址或寄存器] ; 存放输入码(也可能是pop edx)
call 00?????? ; 关键CALL
test eax, eax
jz/jnz/jne/je ; 关键跳转
在CALL之前,两个注册码分别放到了eax和edx里。你只需要在CALL处下 d eax 或 d edx 就能看到正确注册码。
模式二
mov eax [地址或寄存器]
mov edx [地址或寄存器] ; 也可能是pop edx
call 00?????? ; 关键CALL
jne/je ; 关键跳转
这两种情况覆盖了大部分软件。其他不常见的情况,我们以后再讲(别急,下下一章会说)。
关于查找注册码,先到这里。具体操作下一章再展开(已经能接住你的砖头了,还扔?)
最后说说高级阶段——写出注册机。如果你真的热爱Crack,并且相信自己能熬过去,那迟早会走到这一步,只是时间问题。
