使用OllyDbg从零开始Cracking.doc

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用OllyDbg从零开始Cracking

第4章-汇编指令”无操作”,也就是说,它没有特殊的用途。例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。 适当数目的nop指令可以将其他指令完全替换掉。 下面使用OllyDbg重新载入CrueHeadа(CrackMe的作者)的CrackMe。 我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble. 或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。 写入NOP指令后单击Assemble按钮。 这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP指令进行替换,而不是使用一条NOP进行替换。 现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。 现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。 在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。 这里我们需要输入401000。 红色突出显示的是刚刚修改过的字节。前两个是90,然后E8,FF和04,00,00。这是一个Call指令的所有剩余字节。 OD可以撤销我们修改的指令吗? 呵呵,当然啦。 在数据窗口或者反汇编窗口中,鼠标拖选中两个字节。 然后单击鼠标右键,选择“UNDO SELECTION”。 这样就恢复了原来的PUSH指令。 在数据窗口中的话,你就可以看到它原始的字节了。 以上是关于NOP指令的所有内容。 堆栈相关指令的说明 我们之前说过,堆栈就像一个信箱一样,越顶部的信越先被取出来。 PUSH PUSH指令-将操作数压入堆栈中。我们可以看到,CrueHeadа(CrackMe的作者)的CrackMe的第一条指令就是PUSH指令。 “PUSH 0”指令将把0存入到堆栈的顶部,此时并没有压入堆栈,指令执行后,我们看看堆栈如何变化。堆栈的地址在你的机器上可能会有所不同,但效果是一样的。 堆栈地址在我的机器上是12FFC4,可能与你机器上的不同,因为堆栈每次可能放置在不同的位置,其初始内容也可能有所不同,即这里的7C816D4F和你的也可能不同。按F7,将0压入堆栈,堆栈顶部的就是0了。 按下F7,堆栈顶部我们可以看到加入了0。下面的12FFC4中仍然是7C816D4F,堆栈中的其他值并没有改变。 主要的变化就是堆栈的顶部变成了12FFC0(这是PUSH 0指令执行的结果),新压入的数据总是在堆栈的顶部,并不会改变下面的数据。 这里也可以看到,ESP的值变成了12FFC0。 当然PUSH指令不仅仅可以压入数值: PUSH EAX的话,那么堆栈的顶部将保存EAX的值。 同样的适用于其他的寄存器,你也可以压入特定内存地址中的值。 PUSH [401008] 注意,这和下面这条指令的解释是不同的。 PUSH 401008 (没有方括号) 如果你使用的“PUSH 401008”,那么堆栈中将被放置401008。 执行以后,我们可以看到下面的结果: 如果换成是“PUSH [401008]” [401008]表示401008这个内存单元中存储的内容,这个时候我们得去数据窗口中查看它的值是多少。 在数据窗口中鼠标右键单击-Go to-Expression,输入401008,可以看到: 这四个字节是CA 20 40 00。按F7执行这条PUSH执行。 堆栈中我们可以看到在数据窗口中颠倒过来的值,即,它们被倒序放置。 读/写的内容在内存中倒序放置时处理器的特点之一。要怪你只能怪处理器的厂商了,嘿嘿。 通常情况下,没有用方框号括起来的只是一个数字。 现在我们知道,OD中“PUSH [401000]”的意思了。 PUSH DWORD PTR DS:[401008] 像这样的,除非有明确规定,否则OD都是认为你要操作的是4个字节的内存,也就是DWORD。其他格式会在其他指令中予以说明。 POP POP指令是出栈:它会取出堆栈顶部的第一个字母或者第一个值,然后存放到指定的目标地址内存单元中。例如,POP EAX从栈顶中取出第一个值存放到EAX中,随后的一个值随即变成栈顶。 我们还是看到CrueHeadа的CrackMe的开始的语句: 将第一条指令替换成“POP EAX”,注意在第一行,按空格键: 以下是执行此操作,堆栈变化情况的说明: ESP中存放的是12FFC4,它存放的是堆栈的顶部的内存地址。 我们可以看到EAX的值是0(我这里的情况)。 按F7键。 我们可以看到,原来堆栈顶部的值消

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档