怎么样通过软件反汇编得到万能注册码?

怎么样通过软件反汇编得到万能注册码?

由于我在学习电子方面的东西,想找一个示波器,但一般的示波器价格昂贵,所以在网上找到了这个虚拟的示波器,由于本人不知这个东西的实际效果,所以拉回它的软件看看实际效果,但这个虚拟的东西一方面要一些硬件的东西(购买他的硬件的话会免费送注册码),另一方面还必须要注册后才能使用。不过不试用怎么知道实际效果如何呢?于是花了点时间看看它的注册过程,跟踪的过程中由于有一处非常规的反跟踪及注册过程的复杂性,花费了很多时间才搞定,到最后才发现这个软件居然自己预留一个万能注册码。详情请看下文。

了解注册相关信息

首先用PEID查看一下,发现软件加了一个压缩壳ASPACK,使用工具或手动把它脱下,这步很容易,不细说。再用PEID查看,发现是用VC++编写。运行一下程序,当点击打开电源按钮时,会弹出注册框,

可以看到注册码为32位,估计用到MD5(用算法查看软件可以看出真是用到MD5)。现在我们输入假码:987654321,点击确定,程序要求重启,看来是重启型验证加密程序,对于这类程序的破解,注册信息一般放在注册表或放在安装目录的文件中。打开程序安装目录,发现当前有一个INI文件,打开这个INI文件,发现我们输入的987654321就在里面。到这里,我们已经初步总结这个软件的加密方案:加壳+重启验证,注册码放在安装目录下的INT文件中。

挫败反跟踪

好了,现在是OllyDbg出马了(OllyDbg是一个动态调试工具,相关的使用技巧请参看黑防往期的文章,为了叙述方面,下面简称为OD)。

用OD载入目标程序,试F9运行一下程序,发现非法指向错误,然后就会自动退出,但不用OD加载程序则运行正常。

看样子,OD动态跟踪不了,是不是想到用SOFTICE?不过作为一个系统逆向的爱好者,怎么不深入看看,是什么导致这种错误,又怎么去避免这种错误?

如果你也这样想,Follow me,看看我们怎么挫败它。请注意BAADF011这样的数字,一般这是系统分配内存时没有初始化时的数据,分配使用到的API有LocalAlloc及HeapAlloc,现在我们通过跟踪这两个API,看看那里没初始化。先按CTRL+F2重启程序,再在代码窗口中按CTRL+N,打开导入表窗口,找到两个API,右击选“Find references to import”,在弹出的窗口中在所有的API上按F2下断点。F9运行程序同时注意FLAGS参数,看到0043d362的地址处的值了吗?现在将这句改为PUSH8,意思是让HeapAlloc分配内存时将它初始化为0。再运行一下程序,现在OD不会退出了吧。为了方便也可以把修改后的代码拷贝到可执行文件,再另存为另一个文件。

可以看到这处非常有意思的反跟踪,利用HeapAlloc分配内存是没初始化为0,后面在程序中有一些代码如果发现没有初始化,就会把这些非0的东西当作指针使用,就会出现非法调用的问题了。

跟踪注册过程

对于注册信息放在文件中的重启型程序,一般用注册文件作为字符串查找关键地方,但你会发现自己会迷失在程序初始化的代码中。现在我们使用一个简单的方法。

你注意到程序的“未注册”标题字样了吗?可以推测程序有一处判断是否注册,然后设置是否注册的标题。用其它工具如W32ASM等来查这个未注册字符串,但找不到。还是用反汇编老大IDA来找吧。

用IDA载入目标程序。反汇编完后,点击HEX VIEW-A窗口。点击菜单“查找/字符”,查找“未注册”,看到未注册字样了吗?再点击IDA-VIEW-A窗口,IDA自动定位到未注册字符所在的代码处,但这个字符没有正常显示,我们可以按一下“A”键,让这些代码识别为字符串,注意上图椭圆处的调用SUB_408c20+1C3,双击一下,就会到设置是否注册的关键代码处,可以看到设置过程,调用CALL sub_40a440,判断是否注册,然后设置是否显示未注册字样。用OD载入程序,跟入关键CALL 40a440,走到不远十几行代码,看到了吗?正调用我们的假码987654321与www.ost2002.com进行比较呢,如果两者相等就会跳过后面的验证,如果输入注册码不是这个域名就会跳到下面的代码进行更复杂的注册码验证过程,当然你也可以看看它的注册过程,提示一下,后面用到分组加密技术。

现在可以试一下输入www.ost2002.com作注册码,成功了吧?什么限制也没有了。可以看到www.ost2002.com就是作者预留的一个万能注册码。

总结

从本文,读者可以学到一些CRACK的一些基本技巧,如击败反跟踪,如何应对重启型验证的程序。更重要的是,Cracker更应掌握一些发现软件加密漏洞的技巧,尽量以最少的时间击破它。另外对于软件编写者来说,程序中最好不要预留万能注册码。