【翻译】R4ndom破解教程全文翻译(For新手):第十六章(上)
本帖最后由 yysniper 于 2015-6-1 14:58 编辑翻译说明:
1、本教程在52破解论坛及看雪论坛全球同步首发!
2、本教程翻译自国外的The Legend of Random的系列教程,英文原文地址:http://thelegendofrandom.com/blog/sample-page。本翻译教程只是为了给不愿看英文教程以及英文水平不好的人提供方便,同时也是自己的学习过程。该教程对英文水平要求不是很高,不过个人水平有限,有些地方翻译不准的请批评指正。
3、本翻译教程请勿用于商业用途。另,转载请注明!!!
4、感谢The Legend of Random!
发帖说明:
根据译者的时间安排,快的话2-3天会上传一章,慢的话就不造了。如果有段时间没更新请勿怪,因为译者的工作性质,有时是接触不到网络的。
其他章节:
全系列章节导航帖
第十六章(上):Windows消息的处理
好,在干掉了两个病毒(一个是我的,另一个是电脑的)以后,我最终还是上传了最新的教程。本章是其中的三分之一,所有三章处理的都是同一个crackme(相当难的一个),是Detten写的Crackme12。第一部分我们将学习Windows消息是怎么工作的。第二部分是关于自修改代码,该部分我们也会破解该应用。在第三及最后那部分我们介绍暴力破解。如你所猜测的,在第三部分我们将爆破这个二进制文件。每一部分都会继续前面部分的研究结果。这个系列的三部分都比较有挑战性,不过我保证如果你花时间并自己动手实践,你会获得逆向领域中的很关键的知识。记住,如果有任何问题,就在论坛里随意发问。我也会在每一章的最后布置作业,让你为下一章做好准备。课后作业是真正学习的地方。一如既往,你需要的相关文件可以在下载页下载。对于第一部分,下载中包括crackme,以及一份Windows消息备忘单。那么,事不宜迟,咱们开始吧...。一、Windows消息简介本章我们将会讨论Windows消息,以及处理它们的过程。几乎所有的程序,除了用Visual Basic *唉*、.NET或java写的程序以外,任务都是通过使用消息驱动回调过程来完成的。意思就是,与DOS时代程序不同,在Windows中你只需设置窗口,提供各种你想要显示的设置、位图、菜单项等,然后你再提供一个循环运行到程序结束。这个循环的唯一责任是从窗口接收“消息”,然后再将提发送到我们应用的回调函数。这些消息可以是任何东西,从移动鼠标到点击一个按钮,到点击“X”来关闭一个应用。当我们在做一个Windows程序时,我们要在WinMain过程中编写一个无限循环,以及一个无论消息什么时候到来都可以调用的地址。这个地址就是回调(函数的地址。译者注:这几个字是我补充的)。然后该循环用我们提供的地址将其接收到的消息发送给我们的回调函数,在回调函数中我们决定是否对特定的消息做处理,或只让Windows处理它。例如,我们想要显示一个带有OK按钮的警告消息框。我们只关心OK按钮被点击的消息。我们不关心用户是否移动了窗口(WM_MOVE消息),或者是点击了窗口OK按钮以外的某处(WM_MOUSEBUTTONDOWN消息)。不过当OK按钮被点击的消息传来的时候,那就是我们要做些什么的时候了。所有我们不想处理的消息,Windows会为我们处理。对于我们想要处理的消息,我们只需重写相关消息的处理,做我们想做的。设置窗口以及包含循环的主过程叫做WinMain,如果是窗口的的话回调函数通常被叫做WndProc,如果是对话框的话回调函数通常被叫做DlgProc,虽然这些名字可以任何其他的东西。我在下载中包含了一个所有Windows消息的指南,你在学习本章时应该打开看看。你可以在教程页下载到所有的文件。你也可以在工具页面下载windows消息备忘单。二、载入应用Olly载入Crackme12.exe,咱们来看看:(p1)这个一个标准的应用程序,在使用一个对话框作为主窗口,看起来像是用C或C++写的。***如果程序使用的是常规窗口而不是对话框窗口,它看起来会不一样。参见下面的。***注意参数是被压入堆栈,以及对DialogBoxParamA的调用。这个将对话框设置成程序的主窗口(而不是普通窗口,不过别太在意这些细节,这真的没什么关系)。咱们看看有关DialogBoxParamA的帮助怎么说:(p2)对于我们的目的来说,这个CALL的最重要的东西是DLGPROC的地址。它是我们应用程序的回调函数的地址,用于处理所有的windows消息。回头看看反汇编代码,能够清晰的看到这个地址:(p3)这里它是40102B。咱们过去看看它长啥样。这将是...。三、主对话框消息处理回调函数这里我们能够看到它的开头:(p4)这是一个相当普通的DlgProc。它通常就是一个真正的大的switch语句,虽然在汇编形式下,变成了一个真正的大的 if/then 语句。如果你通读了我的上一章,这个看起来应该比较熟悉,本例中它唯一的不同是,Olly无法指出case标签(ie.Case 113 (WM_TIMER))。这个过程在这里有一个原因:是为了响应我们感兴趣的windows消息。如果你仔细看的话,你会看到一堆比较和跳转语句。这是将每一部分代码与Windows发送过来的消息ID进行核对。如果代码匹配了其中一个比较语句,该代码就会运行(译者注:感觉作者这几句怎么那么别扭呢)。否则,它就会尝试所有的比较,没有匹配的话,它就会被发送给Windows,让Windows来处理。咱们来深入的看看这个过程。继续运行程序:(p5)至少可以说它是一个很奇怪的crackme。咱们来把玩把玩。你会发现你可以持续点击按钮,不过什么都不会发生,虽然它有一个“clear”按钮。看起来它希望咱们输入一个指定的代码,如果我们不那么做,程序就什么都不做。现在咱们在DlgProc代码的起始处也就是40102B设置一个BP。重启应用,我们能观察到有消息来了:(p6)一启动应用,我们立马就断在了那个BP。你会发现在我们开始进行第一次比较的地方有几条指令
40102ECMP , 110
如果你在本章相关下载中的Windows消息备忘单中查询ID 110的话,就会发现110是InitDialog的编码:(p7)这个消息给了我们的应用一个机会来初始化一下东西。如果你单步执行,并且消息是INITDIALOG的话,我们会直接到401037执行相关指令:(p8)看看下面的信息区,可以看到ARG.2不是110而是30:(p9)在我们的表中,30是set font(设置字体)消息。所以这是Windows发送的第一个消息。下一个是和10进行比较,在咱们的消息列表中是WM_CLOSE:(p10)所以当关闭按钮被点击时,这段代码就会被执行。下一个要比较的是111,它是WM_COMMAND:(p11)WM_COMMAND包揽了好几种Windows消息,通常与资源相关联,例如点击按钮、选择菜单或点击工具栏中的图标。此外,对于一个WM_COMMAND消息来说,在ARG.3中存储了一个整型数据,用来帮助弄清楚命令消息。例如,如果你点击一个按钮,就会传来一个WM_COMMAND消息,并且ARG.3中有可能保存有按钮的ID。如果你正在用一个徒手绘画程序画画,ARG.3可能保存有当前鼠标的X和Y坐标。(p12)仔细看这个,能够发现过程处理的其他消息只剩WM_COMMAND了(真的,每一个WM_COMMAND都有可能是一个不同的“类型”)。如果你单步执行,就会发现对于当前的消息QM_SETFONT,没有与之有关的代码可以执行,只是在我们的过程的结尾返回了。这是在告知Windows,我们希望Windows来处理这个消息,而不是由我们来处理:(p13)再次点击运行,我们会断在下一个消息:(p14)这回它是一个WM_COMMAND消息。向下单步执行到401081检测该消息的比较指令处,咱们再仔细看看WM_COMMAND的处理程序:(p15)
注意它将ARG.3拷贝到EAX和EDX。然后它对EDX完成了16位SHR(右移位)操作。然后对该值做OR操作,如果它不是0,就跳转。基本上这是在检测参数的两个高位字节是否是0(你正在读汇编语言的书,不是吗?)。EDX的低位两字节保存了被影响到的资源ID。本例中,它不是0,所以我们跳过剩下的代码,然后从回调函数返回:(p16)这里我们能看到正在处理的是111,或者叫WM_COMMAND消息:(p17)这里我们能看到那个跳转:(p18)再次运行程序,我们有停在了我们设置的BP。这回我们处理的是WM_INITDIALOG消息:(p19)咱们运行对话框初始化部分的前面几行代码:(p20)在这个特殊的crackme中,刚好这部分代码比较重要。咱们看到有几个整型被存进以403038为起始位置的内存中(颠倒顺序进行访问,403038是最低位)。咱们先在数据窗口中看看:(p21)看,在咱们运行这几行前,它被初始化为0。现在,单步步过第一个MOV指令,什么也没发生,不过一个0被拷贝到403038处。单步步过下一条指令,能够看到产生的效果:(p22)可以看到0x0DEAD被拷贝到内存中(以小端序列的形式):(p23)单步步过下一行,它做了同样的事情,不过是在地址40303C处:(p24)事实是,以十六进制的双字写入彻底的暴露它对该crackme是很重要的(译者注:为啥?)。接下来,在403040处值42被写入了4次。在ASCII数据区可以看到42的ASCII值是“B”:(p25)最后,整数403000被拷贝到40304C。Olly可以分辨出是一个指向以403000为起始位置的一段代码或数据(记住是小端序列):(p26)最终我们跳到了结尾并返回,等待发过来的下一个消息:(p27)多点F9几次(10)你会看到主对话框窗口被创建出来:(p28)这地方非常的有意思,因为在你点击F9时,每点一次在对话框中就会有新的东西出现(大概运行6次以后),就会接收到一个消息来在对话框中画资源。下一个消息是135,或者叫WM_CTLCOLORBUTTON:(p29)在窗口中画了一个按钮:(p30)下一个是一个写着“2”的按钮:(p31)这时候按F9,你会真切的看到对话框被构建,一次一个按钮。观察到来的所有消息以及在表中查询它们是相当的有趣。你会看到有很多消息到来。如果有那个你不知道的,就Google搜索它,然后就会得到关于它的相关描述。直至最后,底部的label控件会被绘制出来,“No access”文本会被写入进去。整个窗口就快完成了。在窗口彻底完成前,我还得按F9大概35次:(p32)那么现在你知道了一个对话框是如何构建的。设置对话框的基本设置,标题以及整体外观,传进一个回调函数的指针(地址),用来处理所有从Windows发送过来的消息。然后Windows发送一系列的消息,一次一个的发给回调函数,给我们机会让我们在我们收到所渴望的消息时运行代码。在对话框被构建完成后,Windows就进入一个内部循环,就坐在那等我们干些什么。只要我们一有动作,一个带有已经发生的动作的ID的消息就会被发送给回调函数。然后我们就可以决定对该消息做些什么或者忽略它,让Windows来处理它。你需要注意的最后一件事是,如果该应用是在Olly中运行的,只要在窗口上移动鼠标就会导致Olly暂停在处理新消息的消息处理过程的开始处。Windows告诉我们的消息处理过程有鼠标在窗口上移过。基本上,你对对话框做的任何动作都会发送消息给消息处理过程。四、作业1、你能不能找出点击一个按钮后会发生什么,尤其是以403038为起始位置的内存内容方面。不同的按钮做的不一样吗?你能够理解代码正在修改这些内存位置了吗?2、猜一猜密码有多长。
本文PDF文件下载(已排版):本文相关附件下载地址(国外链接,不是一直好用):本系列教程的全部英文文档及工具,原作者网站已挂,暂未恢复 楼主热心!给我们这些小白 提供这么好的翻译!赞!
这个系列如果完整补充上来的话应该是很【系统】的,定义是清晰的,有详细介绍了OD这一灵魂工具的属性,各个板块的含义用途,相反,其他教程则开门见山直接切入到了脱壳破解,一些新手会很迷糊,不知所以。
这个系列是偏新手,偏基础的,赞!
还请闲暇之余,更一下【十六章(下)】
大恩不言谢 :-)
这一个有两种改法,一个是cmp 内存, 0x03 把0x3改为0,点击任何按钮都可以成功。另外一个是这个Cmp下面的跳转,直接用jmp。
还有就是这个长度是31位,也就是说点击31次会出现暴力破解的窗口 新手练热心值在哪也没看到
825936328 发表于 2015-5-31 08:57
新手练热心值在哪也没看到
好吧,帖子下面有个 评分 ,那就是了 这一章的程序在那怎么下,附件里面没有啊 825936328 发表于 2015-6-1 12:42
这一章的程序在那怎么下,附件里面没有啊
http://pan.baidu.com/s/1c0EpWUs
有所有英文文档及相关工具下载 源站确实已挂,默哀 yysniper 发表于 2015-6-1 14:56
http://pan.baidu.com/s/1c0EpWUs
有所有英文文档及相关工具下载
谢谢提供下载网址 OD破解.net程序怎么破解呢 呵呵,这个不错啊 还是我的习惯比较好,我都会保存原网页的mht的。哈哈,感谢楼主~~~