教你花样破解一个crackme并去除暗桩,并附带详细原理讲解

社区服务
高级搜索
猴岛论坛电脑百科教你花样破解一个crackme并去除暗桩,并附带详细原理讲解
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
3个回复

[资源分享]教你花样破解一个crackme并去除暗桩,并附带详细原理讲解

楼层直达
阿里云服务器

ZxID:12008696

等级: 禁止发言

举报 只看楼主 使用道具 楼主   发表于: 2015-08-04 0
教你花样破解一个crackme并去除暗桩,并附带详细原理讲解
破解步骤01:查壳与为什么要查壳?因为有些程序为了减少体积,或者是为了防止破解,会给自己的程序加壳。这种情况下直接来破解程序是非常麻烦的。这就好比一个现实生活中的例子,比如说我的电脑坏了,我需要维修我的电脑,那么我必须把机箱外壳拆开才能对里面的电路板进行操作。这个例子就是一个现实生活中的“脱壳”例子。同理,我们的软件有时候也有壳,如果有壳我们必须把壳搞掉,要不然非常难操作的。当然带壳操作也不是不可以,至少我们现阶段的能力是做不到这一点的。好,我们来查壳: 什么壳都没有,就是一个裸程序。看到希望了吧?这里给新人们提醒一下,这里虽然显示的是Visual C++,其实这软件是易语言写的。易语言用的是VC的link.exe,所以当然软件入口是一样的。当然,这并不重要,只要是无壳我们就开始直接搞。破解步骤02:信息收集啥?你说上od?错!拿到一个软件直接上od是万万不可的。因为你根本就不知道这个软件是什么习性,至少你也要正常跑起来这个软件看看是什么效果。于是,我们走起~ 就是它了,没壳还那么嚣张。我们随意输入进去一个注册码看看? 弹了一个小的消息框,提示你注册失败。点击确定之后,这个消息框就没了,但是并不会影响程序运行。你知道为什么我把这两个东西标红么?因为这是破解的关键点我们利用api断点来定位关键代码的时候,是需要知道行为的。因为,api有很多,有拦截对话框的,有拦截日期的,有拦截文件的……所以你必须知道程序的行为才能一击必杀。那么,这时候你应该知道下什么api断点了吧,嗯,真聪明,就是拦截对话框!好,让我们走起!破解步骤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啦~文件名不要重名即可,防止以后需要原来的文件。好了,这时候你已经完成了一次破解。然后运行一下……嗯,很正常,于是赶紧输入个注册码,点击确定……啥?软件消失了?破解步骤04:去退出暗桩“没错,我早就料到有人会破解掉我的软件,于是乎,我加入了防破解的自毁功能,如果你爆破我的软件被我抓到了,程序就不能运行了。”大家注意,我们遇到典型的退出暗桩了——这还算幸运的,你要知道,有些软件是带有格式化暗桩的……如果触发了后果是不堪设想的,所以,论虚拟机的重要性~俗话说的好,见招拆招才重要……怎么了?害怕了?退出暗桩而已,有什么可怕的,虚什么虚?拿起我们新保存的那个软件!上od!用我们的大杀器——程序退出API断点! ExitProcess是一个程序退出的API,程序调用这个之后,就会退出。我们下这个断点,当程序即将退出的时候,就会被拦截下来。 Duang~程序又一次被od打了个正着。想退出?门都没有,把你拦下来了。和以前一样,程序还是断在系统领空的,我们需要找到程序自己的领空才行。还记得我教你的第一种方法?想要点击执行到返回?错!你点一下试试,点了程序就退出啦~这时候该怎么办呢?下面介绍第二种方法:这种方法是回溯法,也就是看堆栈的调用,然后手动去找代码。首先,什么是堆栈?堆栈是一个计算机术语,或许没有学过编程的很难理解。那么,我再举个例子吧,保证一看即懂:刚开始,我的桌面是空的,这时候有人送我了一封信,我便读信,信中说要我拿起旁边的书,我便把信放在桌子上,把书拿来压在信上,开始读书。书中说我要打电话给xxx,我便把电话拿过来,压在书上,开始打电话。这里的桌面就是一个典型的堆栈。刚开始堆栈是空的,然后放上了一封信,接着信的上面压入了一本书,又压上了一部电话。当我打完电话后,就可以把电话拿下来,继续读书了。读完书,就可以把书拿下来,继续读信了……直到桌面空了为止(程序自然退出)。这就是堆栈工作的整个过程。有时候,为了找某处的代码,我们是可以翻堆栈的,从堆栈里面翻出点东西。这或许需要一点破解的经验,但是对于新人来说,如果程序不是很庞大,随意乱翻都是能找到的。听起来或许很麻烦,但是实际上并不是很难。让我们来试试。(注:本文来自吾爱破解论坛,作者Angelic47,请其他站点保留版权,不要恶意转载!)我们点击这个按钮,打开堆栈: 如图所示: 这就是调用栈了。我们看到,ExitProcess在最顶上,程序即将退出了。那么,我们双击下面那层,进去看看呢? 看,代码好像比较乱,但是至少找到了一个call。我们把call下个断点,然后重新跑程序: 然后,和之前一样,运行程序,输入注册码,注册——程序果然被断在这里: 但是,通过观察我们可以发现,这个地方不应该是call过来的,应该是跳过来的。而上面有许多没有分析的代码,或许我们一会可以对那地方研究研究。这是个什么情况呢?我们观察下右下角: 右下角其实也是堆栈。这里又出现我们输入的假注册码了。这里是怎么回事呢?我们不妨这样: 这是什么原理呢?其实就是快速跳到这附近,对附近的代码进行观察。和之前的那个绿色的堆栈窗口的原理是一模一样的。然后变成了这个样子: 灰不溜秋的不好看,但是上面又一次爆注册码!看来这里一定有猫腻,通过堆栈来看,这里确实是被执行了,而不是一些无用的二进制数据。这种情况下,我们右键——分析——从模块中删除分析 然后成了这样: 我们看,分析的代码依然很乱,而且有一些错误,但是并不要紧。我们看,这里有个跳转,正好能直接跳到下面那个退出的call。看到这里,你可能会不确定这到底是不是关键跳。没事,让我们把这里F2下个断点,然后重新跑一遍程序。你会发现,点击注册之后真的会断在这里。而且右边的寄存器已经爆注册码,这让我们更加肯定是这里。那么,既然注册码不正确,这里就跳向退出,那么我们直接nop掉好了。 和之前一样,保存一个新文件,然后填入随意注册码——点击注册——卧槽?这又是什么? (注:本文来自吾爱破解论坛,作者Angelic47,请其他站点保留版权,不要恶意转载!)破解步骤05:再去暗桩很不幸,你又一次中了我的暗桩。我们来看看这个暗桩是怎么回事。这里的特征是,弹出一个消息框,点击确定后程序自动关闭。那么,我们下两个api断点都可以,也就是说,下退出断点,或者是消息框断点,都是一样的。我们这里下消息框断点好了。这样,我们还可以执行到返回,而不至于它立即退出。至是,返回的时候我们要小心,不能触发了退出,也就是过头了。 看,又一次被od拦截,我们多点几次执行到返回,回到程序领空,成了这样: 因为目前我们也不知道退出的call到底在哪,所以不能继续执行到返回了,我们来看堆栈: 啥?你说你找不到这行?把堆栈使劲往下拽,一定有的~跟踪进去看看: 又是一个倍有易语言风味的call。很明显,这里的这个call就是弹出对话框了。那么,下面那个call会不会是退出呢?不好说~猜测而已。往上看,你会清楚的发现上面有一个很大的je。 这个je是怎么回事?好像是如果注册码正确的话,就会向正确的功能,反之不跳转。没错,就是这样。还是那句老话,不确定的话可以断点,然后重新运行,断下来之后观察下。这里可就不能直接nop喽~你要nop了,那这个程序无论注册码正确或者不正确,都会触发暗桩。为什么?因为该跳的时候跳不动了,所以就算正常的注册码也不能通过这里的验证了。那么我们该怎么改呢?改的方法是把这里的je换成jmp,让它强制跳,不该跳的时候也跳,这样不就搞定了么?好,我们保存程序吧……运行,输入注册码,点击确定,祈祷这次别再有暗桩了…… 你成功了!~此时此刻你一定心里非常兴奋,这时候的程序会发出欢呼声,并一直播放一个表示胜利的音乐。最后我想说:看完这篇文章,你应该也知道api断点的工作原理是什么了:拦截软件的行为。破解就是入门难,实际上哪有你想象的那么难?你需要的是理解而不是背诵。熟练使用api断点,你就能搞定大部分不加壳或者能脱掉壳的软件。如果不信,可以去尝试一下,你会有惊奇的发现。
青空

ZxID:19170623

等级: 督察
配偶: Null.
站务/记者团/我爱我宠

举报 只看该作者 沙发   发表于: 2015-08-04 0
我看不懂。。
这屎里有毒

ZxID:1024363

等级: 大将
举报 只看该作者 板凳   发表于: 2015-08-04 0
图片好美
« 返回列表
发帖 回复