使用OllyDbg从零开始Cracking-08第八章-循环 字符串指令和寻址方式.pdfVIP

使用OllyDbg从零开始Cracking-08第八章-循环 字符串指令和寻址方式.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文档。上传文档
查看更多
第八章-循环_字符串指令和寻址方式 本章,我们将来看看前面章节忽略了的一 些重要的指令。我们学习完了这部分,就 可以开始破解一些小玩意儿了。 循环指令 为了实现循环可以使用前面介绍过一些指 令。例如,你可以将任意通用寄存器指定 为计数器 (通常ECX作为计数器使用),你可 以将其初始化为需要循环的次数,然后执 行循环体,接着计数器递减1,判断计数器 是否为0,如果计数器不为0继续重复前面 的过程,如果计数器为0,就不继续循环了, 而直接执行下面的代码。代码如下: XOR ECX,ECX MOV ECX,15h 将计数器初始化为循环次数15h。接下来 就是循环体了: Label: DEC ECX 该计数器每次递减1。 其实就是循环体了,循环体里面可以是任 意指令。 最后,你需要添加一个判断计数器是否为0 的指令以及条件跳转指令。 CMP ECX,0 JNE Label 第一次判断,计数器的值为14h,因为14h不 为0,所以将继续执行循环,以此类推,直到 计数器为0为止。 我们完整的来写一遍上面的循环: XOR ECX,ECX ADD ECX,15h Label: DEC ECX ;循环体 TEST ECX,ECX JNE Label 让我们在OD上输入上面的代码: 黄色突出显示的是循环代码,这个部分将 重复执行,直到ECX的值为0。循环体里面 包含了多个NOP指令。 我们来单步跟踪一下循环代码,亲眼看一 下循环的执行过程。按一下F7键看看ECX 是怎么初始化的。 再次按F7键,计数器将变成15h,保存了需 要循环的次数。 然后继续按F7键,直到DEC ECX,这个时候 我们的计数器的值将减少至14h。 继续F7单步直到TEST ECX,ECX。该指令判 断ECX是否为0,为0零标志位Z就置1,这样 就停止循环,否则将继续循环。 因为此时计数器不为0,零标志位Z没有置1 ,所以条件跳转指令JNZ将跳转到401007地 址处。下一步计数器继续递减1,这一次减 少至13h。继续单步跟踪直到计数器为0。 当计数器为0时,零标志位Z将置1,这个时 候JNZ将不会跳转至401007地址处,而是继 续向下执行。 这里需要注意一下,JNZ指令与我们前面使 用过的JZ刚好相反,当零标志位Z为0的时 候跳转,为1的时候不跳转。 见到灰色箭头,意味着什么?-这里意味着 跳转不会发生。按F7键我们将跳出循环继 续执行下面的代码。 我们使用熟悉的指令模拟了一个最简单的 循环例子。其实有专门用于循环的指令。 我们来看一看。 LOOP LOOP指令可以帮我们完成前面例子中的事 情- 将计数器ECX的值减1,判断ECX的值是 否为0,如果为0就跳转到指定的地址-将像 前面的例子一样。(可惜的是,大多数现代 的处理器中该指令的效率不如前面模拟的 例子。) 在DEC ECX指令上单击鼠标右键选择-Bina ry-Fill with NOPS。对TEST ECX,ECX和J NZ 401007两条指令也进行同样的操作。 这三条指令用一条LOOP 401007指令替代 。 第一行突出显示 (401000)-单击鼠标右键 选择-New origin here。现在我们来执行 新的LOOP指令吧。 按F7键,再次看到计数器ECX首先被初始化 为0了,然后又被设置为15h了。我们继续 单步跟踪,直到LOOP指令。 这里还是像之前一样,跳转至401007地址 处,因为计数器不为0。这里,计数器递减1 ,现在为14h。 继续单步跟踪。当计数器为0时,循环将结 束。 这里还有一些与LOOP指令相关的指令: LOOPZ, LOOPE 重复循环,直到零标志 位Z置1 LOOPNZ, LOOPNE 重复循环,直到零标志 位Z清0 这几条指令同样是循环指令,即重复循环 体,直到计数器为0,每次循环将计数器的 值递减1。此外,LOOPZ,LOOPNZ指令还将检 查零标志位Z是否为0。只有计数器的值和 零标志Z同时满足条件时才循环。 接着,我们来介绍一下字符串操作类指令 。 串操作 下面,介绍一下串操作类的基本指令 MOVS 该指令是从一个地址向另一个地址复制数 据。源地址保存在ESI寄存器中, 目的地址 保存在EDI寄存器中。我们不需要显示地 指定参数。现在我们在OD中写入MOVS DWO RD PTR ES:[EDI],DWORD PTR DS:[ESI]指 令,样子如下: 这里我们用ESI来保存源地址,EDI来保存 目的地址。 在

文档评论(0)

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

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

1亿VIP精品文档

相关文档