学习破解有一段时间了,但是一直都停留在爆破和内存截取注册码阶段,在网上看到了某牛人写的一篇算法分析的文章,于是就想自己实现一下,按照文章中所说的方法进行调试,发现软件已经将注册算法改变了,下面我们就一起来分析一下这个算法,再使用delphi编程来实现注册机编写。
第一部分:算法分析
我们要破解的目标软件,使用到的工具为OllyICE和PEID,首先安装完软件后使用PEID查看软件是否加壳,我们的运气很好,程序并没有加壳,而且是使用delphi编写的,既然如此,那我们就“以彼之道还施彼身”。一会儿也使用delphi来编写它的注册机。
运行程序进行注册,注册信息随意填写,得到了注册错误信息,关闭程序,打开OD加载程序,先看能不能找到注册失败的信息字符,可以使用OD的字符串查找插件进行查看。稍等片刻,OD就会把程序中出现的所有字符串信息显示出来。
在字符串窗口中找找看,看有没有上面的注册失败信息,注册失败信息出现的位置在0050C75D,上面一条就是注册成功的信息。双击注册失败信息,来到了反汇编窗口,在反汇编窗口中一直向上找,找到这个函数的头部,然后按F2下断点。
函数头部在0050C68C下断后按F9运行程序,然后再进行注册,点击注册后程序就就会被断在我们设置的断点处,按F8单步调试,当程序运行到0050C6CE处时,在堆栈中发现了注册名信息。
继续按F8调试,在下面不远的0050C6E7处出现了我们输入的注册码信息,按照经验来看,在取得注册名和注册码后,程序就应该调用注册算法来计算真的注册码了。继续向下按F8调试,发现了一个跳转指令“0050C701 je short 0050C752”是跳向注册失败的,那么我们就要注意这条跳转指令前面的call调用了。
在跳转指令的前面发现了两个call,分别按F7跟进这两个call进行分析,分析后的结果为0050C6FA就是算法的call,因为前面那个call没有发现对注册名进行运算的指令和算法。既然已经找到了注册算法的位置,那么接下来就是将算法还原了。还原算法就要读汇编代码了,这一直是初学者比较头疼的问题,其实也可以使用IDA的F5功能来将反汇编代码翻译成伪C代码,这样就比较容易理解了, 这里就直接读反汇编代码了。
进入算法call后进行F8分析,当按F8路过0050C4EF处后,发现EAX的值变为了注册名长度的十六进制,路过0050C506后EAX变成了注册码长度的十六进制,可以看出这是在判断输入的注册名和注册码是否为空,“call 004046C8”就是调用函数来获取字符串长度的,如果为空就跳过算法退出算法call。根据经验,分析算法应该就在下面不远处了。继续按F8调试,在0050C513处再次获取注册名长度进行判断,之后就进去了注册算法。
0050C51C到0050C52B是一个循环,是将注册名的ASCII码十六进制逐位累加,然后指令“imul eax,ebx,787”将累加结果乘以十六进制数787,再将结果赋给eax,最后执行指令“add eax,48A6”,把eax中的结果加十六进制数48A6,结果存在eax中,这个结果就是真正注册码的十六进制数值,到此注册算法就算分析完毕了。后面的一些指令是对我们之前输入的注册码进行位数判断以及将真正注册码转化为十进制后与输入的注册码进行比较,这里就不一一分析了,大家可以按F8简单跟踪一下。
这个程序的算法比较简单,基本上就是一些加减乘除的运算,下面我将算法简单的归纳一下,以方便后面编写注册机,算法共分为三个部分:1、逐位累加;2、乘法运算;3、加法运算。累加之前要将字符转化为ASCII码再将十六进制转化为十进制,在delphi中可以使用ord函数来处理,乘法和加法运算就比较简单了,但是要注意要将787和48A6转化位十进制数,用计算器转换即可,十进制分别是1975和18598。
第二部分:注册机编写
有了算法我们就可以编写注册机了,使用什么编程语言都可以,下面就使用我比较喜欢的delphi来编写了,首先是设计一个窗体,添加控件。
然后双击“计算”按钮来编写注册算法,核心代码如下:
代码是不是很简单呢?其实编写注册机并不是很难的。整个破解到这里就结束了,算法也有类似的地方,大家可以拿来试试,通过不断的练习,相信你也一定能够写出属于自己的注册机。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。