Angelic47 发表于 2015-7-30 15:01

[新手福利]来来来,教你花样破解一个crackme并去除暗桩,并附带详细原理讲解

本帖最后由 Angelic47 于 2015-7-30 15:19 编辑

警告:为避免发生头晕恶心、狂吐不止、脏话爆粗等严重不良反应,请非新手者立即点击右上角。本教程为新手量身定造,附带超详细原理讲解。新手不等于完全无基础,请先做好一些准备,如od的使用等等。本文章适合于有些基础但徘徊在入门门槛上的那些新手们。
首先,对于一些新手来说,可能不知道crackme是个什么东西。
crackme,是一种专门为破解而生的小程序。这个程序制作的目的只有一个——作者希望你把它破解了。
也就是说,这玩意是用来练手的,或者是用来研究逆向的,而没有太多的现实生活中的实际应用价值。
我们学破解,玩crackme是很正常的,就和闯关游戏一样。这次就带领大家来破解一个crackme,让新手们快速入门破解!


嘛,crackme goes here~


看到论坛上一群新人在求破,或者是一群初学破解的人拿到软件后找不到思路,于是我做了这个crackme,并自己破解自己,发出来这个教程。
大家拿到crackme之后可以尝试自己破解一下,目标是这样的:

[*]最简单的方式是追码,一追即得,非常简单;
[*]尝试爆破,这个crackme是带暗桩的,你要试试;
[*]如果你把暗桩搞掉了,那么就尝试直接去掉登录框,当然这里不写这个方法啦,有兴趣的可以试试。


好了,教程开始!我们这次的目标是爆破它。
static/image/hrline/1.gif
破解步骤01:查壳与脱壳

为什么要查壳?因为有些程序为了减少体积,或者是为了防止破解,会给自己的程序加壳。这种情况下直接来破解程序是非常麻烦的。
这就好比一个现实生活中的例子,比如说我的电脑坏了,我需要维修我的电脑,那么我必须把机箱外壳拆开才能对里面的电路板进行操作。
这个例子就是一个现实生活中的“脱壳”例子。同理,我们的软件有时候也有壳,如果有壳我们必须把壳搞掉,要不然非常难操作的。
当然带壳操作也不是不可以,至少我们现阶段的能力是做不到这一点的。

好,我们来查壳:

什么壳都没有,就是一个裸程序。看到希望了吧?
这里给新人们提醒一下,这里虽然显示的是Visual C++,其实这软件是易语言写的。
易语言用的是VC的link.exe,所以当然软件入口是一样的。当然,这并不重要,只要是无壳我们就开始直接搞。

http://www.52pojie.cn/static/image/hrline/4.gif

破解步骤02:信息收集

啥?你说上od?错!
拿到一个软件直接上od是万万不可的。因为你根本就不知道这个软件是什么习性,至少你也要正常跑起来这个软件看看是什么效果。
于是,我们走起~

就是它了,没壳还那么嚣张。我们随意输入进去一个注册码看看?

弹了一个小的消息框,提示你注册失败。点击确定之后,这个消息框就没了,但是并不会影响程序运行。你知道为什么我把这两个东西标红么?因为这是破解的关键点!
我们利用api断点来定位关键代码的时候,是需要知道行为的。因为,api有很多,有拦截对话框的,有拦截日期的,有拦截文件的……所以你必须知道程序的行为才能一击必杀。
那么,这时候你应该知道下什么api断点了吧,嗯,真聪明,就是拦截对话框!
好,让我们走起!

static/image/hrline/4.gif


破解步骤03:od调试

除了一些特殊的软件,破解是没有什么捷径的,最好的方法就是用od来调试。
od是一种调试器,这个调试器是直接调试汇编,也就是机器码,来进行工作的。这也就是说,我们需要了解一些汇编语言的知识。
载入od,说好的下API断点呢?来来来,MessageBoxA下了!

这个MessageBoxA断点,就是当软件即将弹出消息框的时候,把软件中断下来,也就是拦截消息框。这样我们不就可以快速找到弹对话框的位置,然后对代码进行处理了么?
好,这时候把程序跑起来,然后注册码随便输入,点击注册,软件即将弹出对话框……duang!被od拦截了,看~

这时候od已经把这个软件挂起了,我们可以对软件施工了。
大家注意,因为是api断点,断点是断在系统API上的。所以,我们不能直接对这里的代码进行分析——因为这是windows系统的代码呀!
如果你把这里的代码修改了,非但程序没有任何变化,反而windows系统就大难临头了~于是乎,我们需要一些操作,返回到程序自身的代码才行,也就是大家所说的“返回到自己的领空”。
我们点击这个按钮——执行到返回:

多点几次,直到上方标题栏的模块字样显示出软件名称,这就是回到程序自己的领空了。然而回到领空之后我们还要掌握一些小技巧,才能精准的定位到关键代码。

下面介绍第一种方法:

这种方法又叫做返回法。适合点击对话框之后,程序能够正常运行的情况。
之前我们说过,点击了那个确定之后,程序不会自动关闭,而是可以继续运行的。那么这种方法完全适用。
就拿这个软件来说,当我们刚刚回到领空之后,会发现并没有什么地方能将那个调用跳过去。那么这时候我们就点击那个执行到返回按钮。
直到这里:

这里有一个call,也就是调用子函数,这个call上面压了一大堆东西,倍有易语言的风格。
这时候,代码就变得可疑了,来来来,让我们往上看!

惊现注册码!这个软件的注册码是固定的(我说追码非常容易吧……毕竟这个软件是我自己写的)。这时候我们已经可以拿这个注册码去注册了。
但是,注册码并不是我们的目标,我们的目标是练手,把这个软件爆破了。
我们继续看,注册码被压入栈之后,下面不远处有个cmp,然后紧接着是一个je。这个je可是跳的非常可疑呀,直接跳向了那个弹窗的call。
你没看错,这就是关键跳了~恭喜~如果你不确定的话,可以将这里下一个断点,然后运行下程序,随意输入个注册码试试,肯定会被断在这里。
既然这样,让我们继续研究下,这个je是如果注册码不正确的时候就跳转,所以我们只要把这个跳转废了,也就是让它不跳,我们就可以破解掉这里的验证。
于是,果断nop掉。

接下来还有一个新人们比较常问的问题——如何保存修改到程序呢?别怕,这篇文章为你们做了充分的考虑。
nop掉之后,被修改的代码会变成红色。让我们拖拽鼠标,选中这部分代码(不选中也行),然后右键——复制到可执行文件——所有修改:
(注:本文来自吾爱破解论坛,作者Angelic47,请其他站点保留版权,不要恶意转载!)

然后会出现一个这样的对话框,不怕,我们继续右键——保存文件

然后你就可以保存一个新的exe啦~文件名不要重名即可,防止以后需要原来的文件。
好了,这时候你已经完成了一次破解。然后运行一下……
嗯,很正常,于是赶紧输入个注册码,点击确定……啥?软件消失了?

http://www.52pojie.cn/static/image/hrline/4.gif


破解步骤04:去退出暗桩

“没错,我早就料到有人会破解掉我的软件,于是乎,我加入了防破解的自毁功能,如果你爆破我的软件被我抓到了,程序就不能运行了。”
大家注意,我们遇到典型的退出暗桩了——这还算幸运的,你要知道,有些软件是带有格式化暗桩的……如果触发了后果是不堪设想的,所以,论虚拟机的重要性~
俗话说的好,见招拆招才重要……怎么了?害怕了?退出暗桩而已,有什么可怕的,虚什么虚?拿起我们新保存的那个软件!上od!用我们的大杀器——程序退出API断点!

ExitProcess是一个程序退出的API,程序调用这个之后,就会退出。我们下这个断点,当程序即将退出的时候,就会被拦截下来。

Duang~程序又一次被od打了个正着。想退出?门都没有,把你拦下来了。和以前一样,程序还是断在系统领空的,我们需要找到程序自己的领空才行。
还记得我教你的第一种方法?想要点击执行到返回?错!你点一下试试,点了程序就退出啦~
这时候该怎么办呢?

下面介绍第二种方法:

这种方法是回溯法,也就是看堆栈的调用,然后手动去找代码。
首先,什么是堆栈?堆栈是一个计算机术语,或许没有学过编程的很难理解。那么,我再举个例子吧,保证一看即懂:
刚开始,我的桌面是空的,这时候有人送我了一封信,我便读信,信中说要我拿起旁边的书,我便把信放在桌子上,把书拿来压在信上,开始读书。书中说我要打电话给xxx,我便把电话拿过来,压在书上,开始打电话。
这里的桌面就是一个典型的堆栈。刚开始堆栈是空的,然后放上了一封信,接着信的上面压入了一本书,又压上了一部电话。
当我打完电话后,就可以把电话拿下来,继续读书了。读完书,就可以把书拿下来,继续读信了……直到桌面空了为止(程序自然退出)。
这就是堆栈工作的整个过程。有时候,为了找某处的代码,我们是可以翻堆栈的,从堆栈里面翻出点东西。这或许需要一点破解的经验,但是对于新人来说,如果程序不是很庞大,随意乱翻都是能找到的。
听起来或许很麻烦,但是实际上并不是很难。让我们来试试。
(注:本文来自吾爱破解论坛,作者Angelic47,请其他站点保留版权,不要恶意转载!)

我们点击这个按钮,打开堆栈:

如图所示:

这就是调用栈了。我们看到,ExitProcess在最顶上,程序即将退出了。那么,我们双击下面那层,进去看看呢?

看,代码好像比较乱,但是至少找到了一个call。我们把call下个断点,然后重新跑程序:

然后,和之前一样,运行程序,输入注册码,注册——程序果然被断在这里:

但是,通过观察我们可以发现,这个地方不应该是call过来的,应该是跳过来的。而上面有许多没有分析的代码,或许我们一会可以对那地方研究研究。
这是个什么情况呢?我们观察下右下角:

右下角其实也是堆栈。这里又出现我们输入的假注册码了。这里是怎么回事呢?我们不妨这样:

这是什么原理呢?其实就是快速跳到这附近,对附近的代码进行观察。和之前的那个绿色的堆栈窗口的原理是一模一样的。
然后变成了这个样子:

灰不溜秋的不好看,但是上面又一次爆注册码!看来这里一定有猫腻,通过堆栈来看,这里确实是被执行了,而不是一些无用的二进制数据。
这种情况下,我们右键——分析——从模块中删除分析

然后成了这样:

我们看,分析的代码依然很乱,而且有一些错误,但是并不要紧。我们看,这里有个跳转,正好能直接跳到下面那个退出的call。
看到这里,你可能会不确定这到底是不是关键跳。没事,让我们把这里F2下个断点,然后重新跑一遍程序。你会发现,点击注册之后真的会断在这里。
而且右边的寄存器已经爆注册码,这让我们更加肯定是这里。
那么,既然注册码不正确,这里就跳向退出,那么我们直接nop掉好了。

和之前一样,保存一个新文件,然后填入随意注册码——点击注册——卧槽?这又是什么?


(注:本文来自吾爱破解论坛,作者Angelic47,请其他站点保留版权,不要恶意转载!)

http://www.52pojie.cn/static/image/hrline/4.gif


破解步骤05:再去暗桩


很不幸,你又一次中了我的暗桩。
我们来看看这个暗桩是怎么回事。这里的特征是,弹出一个消息框,点击确定后程序自动关闭。
那么,我们下两个api断点都可以,也就是说,下退出断点,或者是消息框断点,都是一样的。
我们这里下消息框断点好了。这样,我们还可以执行到返回,而不至于它立即退出。至是,返回的时候我们要小心,不能触发了退出,也就是过头了。

看,又一次被od拦截,我们多点几次执行到返回,回到程序领空,成了这样:

因为目前我们也不知道退出的call到底在哪,所以不能继续执行到返回了,我们来看堆栈:

啥?你说你找不到这行?把堆栈使劲往下拽,一定有的~
跟踪进去看看:

又是一个倍有易语言风味的call。很明显,这里的这个call就是弹出对话框了。那么,下面那个call会不会是退出呢?不好说~猜测而已。
往上看,你会清楚的发现上面有一个很大的je。

这个je是怎么回事?好像是如果注册码正确的话,就会向正确的功能,反之不跳转。
没错,就是这样。还是那句老话,不确定的话可以断点,然后重新运行,断下来之后观察下。
这里可就不能直接nop喽~你要nop了,那这个程序无论注册码正确或者不正确,都会触发暗桩。为什么?因为该跳的时候跳不动了,所以就算正常的注册码也不能通过这里的验证了。
那么我们该怎么改呢?改的方法是把这里的je换成jmp,让它强制跳,不该跳的时候也跳,这样不就搞定了么?
好,我们保存程序吧……运行,输入注册码,点击确定,祈祷这次别再有暗桩了……

你成功了!~
此时此刻你一定心里非常兴奋,这时候的程序会发出欢呼声,并一直播放一个表示胜利的音乐。




http://www.52pojie.cn/static/image/hrline/4.gif


最后我想说:


看完这篇文章,你应该也知道api断点的工作原理是什么了:拦截软件的行为。
破解就是入门难,实际上哪有你想象的那么难?你需要的是理解而不是背诵。熟练使用api断点,你就能搞定大部分不加壳或者能脱掉壳的软件。
如果不信,可以去尝试一下,你会有惊奇的发现。

a46213599 发表于 2015-8-4 06:55

修改下面几处:
00401132      0F84 6D000000 je crackme.004011A5                      ;NOP掉此处,转向-->使劲猜。。。
00401138   .E8 00000000   call crackme.0040113D                  ;无

00401211      0F85 66000000 jnz crackme.0040127D                     ;NOP掉此处,使其转004012EC

004012B2      EB 56         jmp Xcrackme.0040130A                  ;................最想要的
004012B4      90            nop
004012B5      90            nop
004012B6      90            nop
004012B7      90            nop

004012EC   .E8 12010000   call crackme.00401403                  ;破破破,还想破我软件吧?
004012F4   .F8            clc
.......
004012FA   .E8 10010000   call crackme.0040140F                  ;程序终止

a46213599 发表于 2015-8-2 09:08

破解就是入门难,实际上哪有你想象的那么难?你需要的是理解而不是背诵。熟练使用api断点,你就能搞定大部分不加壳或者能脱掉壳的软件。

老师说的好!也祝我自己也破解成功了,但观察堆栈-->跟踪反汇编代码---这一步如果选错还是不行,不那么完全理解。

希望发个易语言源代码,我想好好研究一下,这个破解练习小软件很有意思。

扯淡的ni 发表于 2015-7-30 15:08

看着怎么这么复杂啊,头都大了

Cizel 发表于 2015-7-30 15:10

看着有点多的感觉。

马启龙 发表于 2015-7-30 15:14

下次来个 没有任何提示的软件来试试没有标题没有 信息框

苏紫方璇 发表于 2015-7-30 15:15

感谢楼主发原创教程,支持楼主了

艾莉希雅 发表于 2015-7-30 15:15

LZ好评……新手福利向,跳步少

Angelic47 发表于 2015-7-30 15:15

马启龙 发表于 2015-7-30 15:14
下次来个 没有任何提示的软件来试试没有标题没有 信息框

这次中间有一段没有任何提示的,就是退出暗桩
下次我会写个什么提示都没有的那种,用消息断点

qianda66 发表于 2015-7-30 15:19

来顶下。。话说暗装还真是多啊。我最近想爆破一个软件,也是很多暗桩。。希望可以通过lz教程的练习爆破成功~~~{:301_988:}

zizhuyifeng 发表于 2015-7-30 15:19

http://www.52pojie.cn/thread-389639-1-1.html能否指点一点,谢谢啦~~

我宠我爱 发表于 2015-7-30 15:44

好评……新手福利向,跳步少
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: [新手福利]来来来,教你花样破解一个crackme并去除暗桩,并附带详细原理讲解