【翻译】R4ndom破解教程全文翻译(For新手):第六章
本帖最后由 yysniper 于 2015-4-26 21:32 编辑翻译说明:
1、本教程在52破解论坛及看雪论坛全球同步首发!
2、本教程翻译自国外的The Legend of Random的系列教程,英文原文地址:http://thelegendofrandom.com/blog/sample-page。本翻译教程只是为了给不愿看英文教程以及英文水平不好的人提供方便,同时也是自己的学习过程。该教程对英文水平要求不是很高,不过个人水平有限,有些地方翻译不准的请批评指正。
3、本翻译教程请勿用于商业用途。另,转载请注明!!!
4、感谢The Legend of Random!
发帖说明:
根据译者的时间安排,快的话2-3天会上传一章,慢的话就不造了。如果有段时间没更新请勿怪,因为译者的工作性质,有时是接触不到网络的。
其他章节:全系列章节导航帖
第六章:第一次(真正的)破解
一、简介
欢迎来到我的教程的第六章。本章我打算离一个真家伙近点:一个真正的crackme。它也包含在本章的下载中。crackme是一个渐进式学习逆向工程的好方法,而不应该直接从“真正”的程序入手,crackme可以从易到难进行,这样你就可以以线性方式学习。最终,我们会一路走到真正的程序,不过也要看到我们才刚刚起步,这些crackme也会带给我们巨大的挑战。你可以在教程页下载到相关文件和本教程的PDF版(译者注:英文版的,此中文翻译我会在教程的最后放出)。我将会用OllyDbg1.10(我的版本或原始版本都行,不过如果你用我的版本的话,它看起来和图片一样)。我推荐你从工具页面的Olly Plugins下载“MnemonicHelp”插件,因为本教程将会用到(教程的下载中也包括的有)。解压后,将其与x86eas.hlp文件放到Olly文件夹下的plugins目录下。如果没有plugins文件夹,就在Olly的主目录下创建一个。然后打开Olly的Options->Appearance->Directories 标签,然后选择你放置插件的目录。你再在Olly的主目录下创建一个叫“UDD”的文件夹,然后让当前设置页的另一个选项也指向这个文件夹。UDD文件是Olly给一个程序做的“便条”,你设置的所有断点、做的注释、一个二进制文件的特有设置都会存储在UDD文件中,通常叫做“程序的名字.udd”。如果你在逆向时需要离开一段时间做别的工作,UDD文件可以让你回来继续对程序进行逆向,因为所有的都被保存起来了。下面是设置两个目录的窗口(带有我的设置):(p1)
二、探究二进制文件
先载入Crackme2.exe:(p2)
我前面说过,在开始之前的最重要的事情是运行程序看看情况。这可以给你大量的信息:有没有试用时间?是不是有些特性被禁用?是不是只能在有限次数内运行?有没有注册窗口让你输入注册码?这些都是需要知道的很重要的东西,随着你在逆向领域做得越来越好,你会获得越来越多的经验让你知道应该找什么(需要多长时间来验证注册码?是不是强制你访问一个网站?......)(p3)http://attach.52pojie.cn/album/201504/20/083630m98m2i52n2u6nu2w.png
看起来比较直接了当。我们来试试:(p4)
这不是我们想要的。我们看看能不能让Olly做些有用的事。回到Olly,我们来试试我们当前知道的第一个(也是唯一一个)工具。搜索下字符串。右键->Search For->All Referenced Text Strings:(p5)
看起来前途光明啊!这里有几件事要注意下。第一,序列号至少得4个字符。(p6)
第二,我们准确的知道了显示好消息和坏消息的地方在哪了。(p7)
点一下4010F4那行,看看有什么东西:(p8)
这是处理简单crackme相当标准的流程(简单点的商业程序也是一样)。搜索文本字符串、找到显示你的注册码/密码/许可证正确与否的相关信息,然后转到那部分代码,你就会看到好的和坏的消息彼此间靠的相当的近呢。那么,根据R.E.T.A.R.D. 的2号规则,查找 比较/跳转语句,以及你想要的那个CALL。咱们来找找那个跳转语句。我们找到的第一个跳转是在4010EB,一个JNZ语句。如果我们点击这一行,Olly就会向我显示它会跳向哪里。(p9)
可以看到,这条指令跳过了“Good Boy”,直接跳到了“Bad Boy”。这看起来是一个关键点。我们都知道,一个跳转的前面一般都会进行比较,以此来决定是不是要进行跳转。往JNZ指令的上面看,我们可以看到一条TEST EAX, EAX。你可能还没有学到汇编语言书籍关于TEST指令的部分,我们来看看能不能找到这个TEST指令是干什么的。在本章的前面你已经安装了MnemonicHelp 插件,那就是我们要用到的。在TEST指令上右键,你会在右键菜单中看到一个问号。点它:(p10)
就会打开Mnemonic帮助窗口:(p11)
在上面的文本框中输入“Test”,然后选择(双击)“TEST”。然后就会显示相关指令助记符的帮助:(p12)
我们就可以看到TEST指令意思是“Computes the bit-wise logical AND of first operand (source 1 operand) and the second operand (source 2 operand) and sets the SF, ZF, and PF status flags according to the result. The result is then discarded.(译者注:这段就不翻译了,一是这是帮助中的原文,主要是向大家演示;二是,TEST指令的意思咱们也可以GOOGLE的,中文比看这个容易多了。)”。大部分的时间里,如果TEST指令正在测试的两个寄存器的指令相同,就意味着它正在检查它们是不是0。所以这个满足我们跳转之前要进行比较的需求:(p13)
这两条语句的意思是“如果EAX不等于0,就跳到40110D”,也就是“Bad Boy”那里。好吧,这当然不是我们想要的,咱们来试试我们的推测。在JNZ指令处设置一个断点,重启应用。输入用户名和序列号(记住,至少四个字符),点击crackme上的check按钮。Olly就会断在我们的BP(译者注:BP即是breakpoint,以后就直接用BP不再注释了)处:(p14)
现在,我们可以看到我们将会跳过good boy,直接到bad boy。咱们来让它不发生。帮Olly翻转0标志位(参见前面的教程):(p15)
我们可以看到,现在那个跳转没有实现。运行程序看看:(p16)
耶,这就是我们想要的。***忽略那个关于keygen的消息,有些crackme还有其他的目的要求,不过我还是用它们,我们也需要来学习它的其他两点。一旦我们从这个系列教程中学到了更多的知识file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsA22C.tmp.jpg,我们还会回来使用它们中的许多。
三、打补丁
重启crackme,运行之,输入用户名和序列号,Olly就会断在我们的断点处。你会注意到,我们会再次跳到bad boy,因为改变Olly的标志位只是临时的方法。这回我们不去临时修改标志位,我打算修改二进制文件中的代码来完全我们想要的。这个叫做打补丁。点击我们暂停的那行(4010EB),点一下该行的指令列(有JNZ SHORT…的那部分),然后按一下空格键。会有一个显示该行指令的窗口弹出,也是修改指令的对话框:(p17)
现在,我们要做的是将这个跳转到bad boy消息处的跳转改成永远不会跳,意思是我们确实不想让这个跳转实现。我们准备做的是,将其替换成一个什么都不做的指令,那就是NOP指令。NOP意思是No OPeration(不操作)。将对话框中的JNZ SHORT 0040110D修改成 NOP:(p18)
那个“Fill with NOP’s”复选框就留那不用管。现在点一下Assemble按钮,提交所做的修改,再点一下Cancel按钮关闭窗口。***顺便说一下,如果你没有点那个Cancel按钮,而是一直点Assemble的话,你会一行一行的修改每一行。这是Olly的一个“特性”,用来让你一次修改好几行代码用的。可以让你不用每行都敲空格键。我保证你第一次打补丁的时候会让你疯掉的:X。注意我们暂停的那行已经改变了,那条指令现在变成了两个NOP,而不是JNZ指令了,并且变成了红色(因为Olly对于被修改的项目以红色显示)。(p19)
有两个NOP的原因是,NOP操作码只有一个字节长,而被替换的JNZ指令有两个字节长,所以Olly用两个NOP来替换。你也会注意到跳转箭头消失了,因为这行已经不再有任何跳转了!现在单步运行,你会走到good boy处。然后good boy显示出来了,你开心的笑了file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB6F5.tmp.jpg。(p20)
四、保存补丁
有一个重要的事情要注意,如果你重载或重启应用的话你所打的补丁就没有了,除非你将补丁保存到二进制文件中。你可以看到补丁在起作用,回到Olly打开Patch窗口(点击Pa图标或Ctrl+p):(p21)http://attach.52pojie.cn/album/201504/20/083709hb55jx5jbeb5c8z5.pngPatch窗口显示的是我们给程序打的所有补丁。注意地址是红色的,以及State列的“Active“。我们的程序仍然在运行,就意味着我们的补丁已经实现,如果CPU运行了这个代码,它运行的将是打过补丁的版本。现在,重启应用(Ctrl+F2)。首先,Olly可能会显示一个错误,一个很长很复杂的错误,基本上是告诉我们补丁(以及断点)没有”坚守“在原来位置,因为Olly无法追踪它们(其实比这个要复杂一点,我们后面会看到)。关掉那个窗口,打开断点窗口:(p22)http://attach.52pojie.cn/album/201504/20/083710paas606668ssaszt.png看看我们的断点已经失效了file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps5029.tmp.jpg。重新激活断点(空格键),Olly会再次断在该断点。运行程序,输入用户名和密码,我们会停止我们前面打补丁的那一行(它上面的断点又可用了):(p23)http://attach.52pojie.cn/album/201504/20/083711nenaeslqu3lg2g3b.png看看,我们的两个NOP消失了,原始的代码又回来了(不过变成了灰色)。我们的补丁被回收了!现在回到Patch窗口:(p24)http://attach.52pojie.cn/album/201504/20/083712d17cmmpajgfd7383.png注意那个地址不是红色的了,State也变成了”Removed“。Olly已经禁用了我们的补丁,并且在我们每一次重启程序时都会这么做。我们想要做的就是让这个补丁永远有效,而不用每一次都激活它。为了让我们的补丁能够长久有效,我们必须将修改的版本保存到磁盘。首先,选中补丁再按下空格键以重新启用补丁。那个JNZ指令就会变回到我们的NOP,那两个NOP也会以红色字体重新出现在反汇编窗口。现在,在反汇编窗口的任何地方右键,选择”Copy to executable“->”All modifications“:(p25)http://attach.52pojie.cn/album/201504/20/083713huo09cknhubmnu84.png如果弹出窗口问你是否要保存所有的修改,你就选”Copy All“:(p26)http://attach.52pojie.cn/album/201504/20/083714nyzky5k8gy794okw.png当你打了多个补丁,并且想一次性全部保存的话,这么做很重要。因为有时候,你很容易就忘记你打过多个补丁。本例中,即使我们只打了一个补丁,选择所有的补丁也只会保存这一个。当然,只有在Patch窗口中被激活的补丁才会被保存。后面,你可能想要选择”Selection“而不是”All Modifications“,但是你必须保证你在反汇编窗口所做的修改是高亮显示(通过点击或拖拽以选中所有修改的行)。如果你选中的行比修改过的行要多也行,因为Olly只会更改已经修改的行。在点击”Copy All“以后会打开一个新窗口,里面基本上是整个进程的数据,不过我们的补丁也在里面:(p27)http://attach.52pojie.cn/album/201504/20/083715n0mkvmfkvx9bmzrz.png在顶部你可以看到我们的补丁。但要意识到这个只是在内存中的修订版本,还没有保存到磁盘呢。不过,如果你关了这个窗口或重启了程序,它是不会被保存的!咱们来保存好它:右键新窗口的任意位置,选择”save file“。这会将该进程的内存空间数据保存到一个文件中。一个另存为对话框会显示出来。将文件另存为Crackme2_patched(我通常在后门加一个”_patched“用来区分,你也可以加任何你喜欢的):(p28)http://attach.52pojie.cn/album/201504/20/083716tzj21fot1a7a1sff.png我们现在有了一个crackme的打补丁版本。咱们来试试看。在Olly中打开这个新文件(打过补丁的)。按下Ctrl+G或点击GOTO图标,输入我们打过补丁的地址:(p29)http://attach.52pojie.cn/album/201504/20/083717kbkc6cj966j689b8.png看看咱们的补丁:(p30)http://attach.52pojie.cn/album/201504/20/083717jnymlbw5kww5tjym.pngyes,补丁还在那。现在运行程序,输入info 和viola(译者注:info和viola是作者用了当用户名和注册码的输入):(p31)http://attach.52pojie.cn/album/201504/20/083718per3tat3z3dbebas.png现在,我们有了我们第一个破解过并打过补丁的二进制文件:0。
五、作业
本章的作业很简单(只要你一直在学习汇编语言file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps4C05.tmp.jpg)。思考题:你可以将4010E9处的”TEST EAX, EAX“修改成什么,来防止跳转到显示bad boy处?要注意的是无论你将TEST指令修改成什么,都不能超过2字节,那是TEST EAX, EAX指令的长度。如果你打了一个长点的补丁,就会覆盖掉JNZ指令后面的指令......
ps.如果你需要提示的话,请点这里。不过你应该真正意义上自己试着做。那是学习的最好方法!
本文PDF文件下载(已排版):本文相关附件下载地址(国外链接,不是一直好用):包含Crackme2、MnemonicHelp.dll插件、X86指令帮助文件、英文原文文档、英文视频教程 应该修改成XOR EAX,EAX sighout 发表于 2016-9-2 10:46
我没办法下载附件,不能调试,我认为改 CMP EAX,0也可以成功,因为按照正常流程下来,eax不等于0所以进行 ...
然而并不能,因为指令占空间太大了,吧后面的jnz指令给覆盖了。 尼玛怪了,都是从相册插入的图片,前面20张怎么不显示 感谢教程 谢谢翻译,更新到第六章了 好东西啊,都翻译过来,容易看多了 Great God, worship!
yysniper 发表于 2015-4-20 09:08
尼玛怪了,都是从相册插入的图片,前面20张怎么不显示
好了吗? Hmily 发表于 2015-4-23 16:53
好了吗?
我改成上传附件,然后插入图片了。主要是我的网络太差,上传附件经常失败。 yysniper 发表于 2015-4-23 17:06
我改成上传附件,然后插入图片了。主要是我的网络太差,上传附件经常失败。
网络不好确实头疼。 我直接改成了TEST EAX, EBX 然后是成功的 但是我不知道为什么{:1_909:}