软件破解小记【转】

最近突然对软件破解起了兴趣,主要是想在软件加密上能够有所提升。刚好舅舅最近追紧我要一个软件的破解版本,我苦苦的在网上找到唯一的一个破解,还是有三十次的限制。(现在人,居然也可以以破解软件为生了:)看来我研究这个还是有前途的:))

在万般无赖下,决定自己来进行破解。这个决定其实对于最近的我来说,真可是一个大的挑战--我已经很长时间没有激情做新东西了。因此虽然满怀喜欢,却又有点怀疑能否完成。

破解的对象是一个财务软件,名字叫XXXXX(我故意隐藏了产品的名称)。其软件是一个C/S结构的网络版软件。软件需要加密锁的支持。如果加密锁通过了,则显示正版,否则是试用版。从演示看,软件只有在启动的时候检测加密锁(这告诉我们,加密点应该多点)。

有一个额外的条件在于,网上找来的破解是程序中一个动态链接库(XXXXX.dll)的破解。这给我一个提示:我只要破解这个XXXXX.dll就可以了。网上的破解版由于加过壳,而我现在对于加壳的软件如何破解更是不了解,因此目标转向了原有的XXXXX.dll。使用W32DAsm打开,发现各个输出函数的定义及实现都可以发现,应此证明此Dll没有被加密。

调试二进制程序,一般分静态分析和动态调试。静态分析一般都使用W32Dasm来进行。通过W32Dasm可以很方便地定位到其输出函数的起始位置。通过粗读这些代码,发现几个情况:

FindNetRockey

FindRockey

CheckNetRockey

CheckRockey

HaspLogin

HaspLogout

根据我的知识(我们公司也是用这些加密锁),这些程序都是读取加密锁的函数。可是静态分析之后,发现自己的能力有限,不能完全理解代码。不过这个过程中,复习了一下Win32汇编代码的知识,包括堆栈平衡和通过EAX返回值的方式。

经过同事推荐,我采用了OllyDbg来进行动态调试(这是一个很正确的决定)。

一开始,我想直接调试XXXXX.dll,我用OllyDbg直接打开XXXXX.dll文件,发现OllyDbg会自动使用LoadDll.exe来装载此Dll。使用这个程序可以在没有宿主程序的情况下,进行动态调试,猜测函数的参数及返回值。不过我后来并没有直接使用这个方法。

由于对OllyDbg动态调试不是很了解,我想,除了破解XXXXX.dll,我如果破解了XXXXXClient.exe程序应该也可以的。不过XXXXXClient.exe是使用VB编写的,汇编码中有大量的VB的影子。

我第一要做的就是,定位到读取加密锁的函数入口。一开始,我采用单步跟踪,发现太慢,而且也失去了耐心。后来想起,既然是Dll,那么必然会调用LoadLibrary及GetProcAdress。那么只要知道这个函数地址,说不定可以能快一点找到。

如何得到GetProcAdress的地址?我采用了Dependency,用Dependency打开Ac990Client.dll,选择Walk按钮,可以在输出Log中发现,在什么时候调用了XXXXX.dll

我得到了函数地址A,在OllyDbg中,定位到A,确实定位到了LoadLibrary函数的调用处,另外,我发现在OllyDbg中,可以跟踪进入其调用的Dll中。那么如果我直接进入XXXXX.dll中设置断点,是否可以进去呢?事实证明我的猜想是对的,这为我更快地得到结果奠定了基础。应该说前面走了很多弯路。

通过一番地跟踪,几乎是在最后失望的情况下,我发现函数HaspLogin被调用的时候,函数本身只有两个出口。其中一个返回前,做了Xor EAX, EAX(设置EAX为0),而另一个设置EAX为1。通过调试发现,在没有加密锁的情况下,走了第一条路线,那么如果是第二呢?我动态地设置了EAX为1,结果发现XXXXXClient.exe显示正版的字样!Great!

那么下面就是如何修改程序了,很遗憾,我没有发现OllyDbg怎么修改编辑。想起同时推荐的HiView这个程序,在刚才发现的位置前,修改了几个跳转的地址(这段代码前必然有jne A0000753等字样,只要跳转到xor EAX,EAX处就可以了),另外我还将一处本来特耗时间的call改成了几个nop的组合。保存,测试!好了,总于成功了。

这是我第一次破解程序。本身没什么特别的大,只是让我熟悉了很多相关软件的使用,并较为完整地理解了破解的过程。以后还要继续破解!

你可能感兴趣的:(软件)