使用OllyDbg从零开始Cracking-04第四章-汇编指令.pdfVIP

使用OllyDbg从零开始Cracking-04第四章-汇编指令.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章-汇编指令 【安于此生译】 之前的章节主要是理论知识,现在我们要 在OllyDbg中实践一下,为后面打开基础。 OllyDbg中几乎所有的标志我都有考虑,如 果你遇到了我没有给出的指令,你可以查 阅更加全面的汇编指南。 NOP (无操作) 运行这条指令不会对寄存器,内存以及堆 栈造成任何影响,英文单词的意思是”无 操作”,也就是说,它没有特殊的用途。 例如,你用一个短指令来替换一个长指令 的话,如果处理器 没有错误多余的空 间将会被NOP填充。 适当数 目的nop指令可以将其他指令完全 替换掉。 下面使用OllyDbg重新载入CrueHead а(C rackMe的作者)的CrackMe。 我们可以看到反汇编的源代码,如上图第 一条指令是PUSH 0,占两个字节, 在这条指令上面单击鼠标右键选择Assemb le. 或者直接使用快捷键-空格键,在弹出窗口 的编辑框中输入NOP。 写入NOP指令后单击Assemble按钮。 这里我们可以看到OD设计的非常智能,考 虑到PUSH指令占两个字节,OD会使用两条N OP指令进行替换,而不是使用一条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的作者)的C rackMe的第一条指令就是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-Expre ssion,输入401008,可以看到: 这四个字节是CA 20 40 00。按F7执行这 条PUSH执行。 堆栈中我们可以看到在数据窗口中颠倒过 来的值,即,它们被倒序放置。 读/写的内容在内存中倒序放置时处理器 的特点之一。

文档评论(0)

@思念@ + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档