危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18787859

浅谈破解三部曲

学习破解也有一段时间了,其中的艰辛想必我等一定深有体会。一直以来都很喜欢危险漫步博客中的文章,也学到了不少东西。很感谢那些大牛们,给我们提供了很多宝贵的经验!

希望这篇文章能给包括我在内的带来一些启发。

本文分为三部分:第一部分为脱壳去自效验;第二部分为爆破;第三部分为算法的简要分析。

好了,废话不多了,现在就让危险漫步带大家进入正题吧!!!

第一部分:

拿到一个软件,要对他进行分析。第一步要做的就是查壳,分析这个软件是用什么语言写的。因为不伺的语言可能有不同的破解方法:比如说如果是Delphi的程序,会发现用一般的API函数不能拦截文本框中的数据。因为Delphi通过向Edit发送WM_GETTEXT消息来获得文本内容,整个过程中并没有调用任何WIN32 API函数。这时我们就可以通过按钮事件来定位关键代码。可以说,了解软件的语言是对下面的分析启到了指路明灯的作用。

用PEID进行查壳。是ASPack 2,12一>Alexey So:lodovnikov,用ESP定律轻松脱掉。是VC8一>Microsoft Corporation *。运行脱壳后的程序,发现程序打开后,画面一闪而过。很明显这是有自效验,怎么办?如果你有一定的算法分析能力的话,可以带壳破解。但是大部分的朋友还是喜欢爆破的,因为简单方便。好吧,现在就让我们来去掉它的自效验。下断点bp ExitProcess,bp ExitThread。程序在成功的在ExitProcess处断下来了。

但是,我们向上找,并没有发现跳转,怎么办?我们换一个函数试试。下断bpPostQuitMessage。同样,程序也成功的断在PostQuitMessage。

发现程序调用GetProcAddress取得Func函数的地址,然后再调用Func这个函数进行自效验。我们把00408D7B的j nz改成jmp,重启程序,程序正常打开。我们在00408D5A上向上翻,依次发现,程序依次调用WinAntiDebug,AntiDump,Anti_RegMon,AntiFileMon,SoftICeXP等函数进行了反调试检测。看着不爽,通通nop掉。

第二部分:

打开脱壳后的程序。单击,帮助一注册。发现未注册的程序有三点限制:第一点,未注册的版本只能选三张牌面图案;第二点,未注册的版本不能玩宝鸡挖坑;第三点,未注册的版本只能使用100次;

第一点:

单击设置中的选项,出现牌背图案。单击图案,出现提示对话框。下断bp MessageBox,没有断下来。怎么办?注意提示的字符串,让我们来搜索一下。发现了。跟随字符串,来到代码处。往上找,发现有跳转,改成jmp,成功爆破。

第二点:

游戏开始时,单击宝鸡挖坑,弹出未注册提示。和第一点一样,我们搜索字符串就能到达关键处,此处就不多说了。

关键在第三点:

未注册版本只能使用100次。单击帮助——注册,可以看到限制次数。前两点会弹出提示框,而第三点却只有文字说明,怎么办?应该下什么断点呢?一开始,我也想了好久,后面静下心来分析了一下程序的流程,才找到了关键部分。未注册版本只能使用100次,我们不可能让这个程序使用100次,看他会产生什么注册提示?那么,就让我们来猜一下。第一种情况:像前两点一样,弹出一个对话框,提示使用限制已到。

我们搜索字符串,并未找到有用的信息,难道是字符串加密!但是前两点的字符串信息都能找的到,这种可能性很少。第二种就是弹出注册框,要求你注册。后来事实证明第二种假设是正确的。好了,也许有人会说,总不能每个程序都靠运气来假设吧。那么我们就用常规的方法来分析。分析的关键就在这“100次”上。到底怎么样才能算上一次。打开程序选择游戏模式算一次,还是单击发牌算一次。解决这个问题很简单,就是一个个的去试。

实践是检验真理的唯一标准。嘿嘿…,单击发牌(中间那个牌)后,使用次数一。分析可知,这个中间的牌是一个Button。我们可以通过消息循环找到关键处。但是此处我介绍一个更简单的办法。单击发牌,发现左下角有字符串提示。通过寻找字符串,我们直接到达了Button内的函数。

是不是比寻找消息循环更简单呢!如果你有时间的话,往上翻,是不是看到了窗口过程。嘿嘿!!!我们继续往下走,到达了关键代码处。dword ptr [esp+20]中保存的就是程序已使用过的次数,与64h(转成十进制为100)比较。如若大于100

就跳向0040F930。而0040F930处继续运行下去便会弹出注册对话框,提醒你使用次数已到要求注册。我们把可以把0040F90B和0040F92E改成jmp,也可以把0040F914处nop掉。当然如果你愿望,也可以把64h换成一个很大的值。总知而言,是方法多多啊。

第三部分:

限于篇幅,在此对算法部分作简单分析。该算法是通过注册姓名和机器码来算注册码。程序根据一定的算法,将注册姓名和机器码累加。再经过一些运算。然后除以11h,依次取5个余数,并且要求全不相同。这5个余数分别决定了前5个字符在注册码中的位置。因为注册码有20位,而程序只对6个字符进行验证。第6个字符是最后一位。也就是第20位。知道这个写注册机就方便了。我们把注册码初始化为20个0,然后使用内联汇编把算法部分算出的值6个值依次写入这20个O中的相应部分,然后再把他输出就行。查看是否注册成功。

总结:

其实这篇文章重在思路,如果你能定位到关键代码处,我想Crack也只是时间问题。难就难在定位,当有时常规的方法行不通的,我们可以发散思维,偿试一下非常规的方法。达到成功的路有很多,或许你是靠运气,但最起码你做到了!