使用OllyDbg从零开始Cracking-06第六章-比较和条件跳转.pdfVIP

使用OllyDbg从零开始Cracking-06第六章-比较和条件跳转.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文档。上传文档
查看更多
第六章-比较和条件跳转 通常情况下,比较指令有两个操作数,并 根据比较的结果来决定程序是否跳转到后 面的分支中。 我们知道,当注册程序要求我们输入序列 号的时候,这个时候,程序会执行一条或 者多条比较指令,根据比较的结果来判断 你输入的序列号是否正确。 接下来,我们将详细介绍比较和跳转指令 。 我们知道,某些指令的指令会影响到标志 位,最常见的就是零标志位Z。 CMP 该指令是比较两个操作数,实际上,它相 当于SUB指令,但是相减的结构并不保存 到第一个操作数中。只是根据相减的结果 来改变零标志位的,当两个操作数相等的 时候,零标志位置1。 看看下面的例子: CMP EAX, ECX EAX与ECX相减,它们本身的值并不改变, 只是根据它们相减的结果来决定零标志位 Z是否置1。在OD中来看一个例子。 写入CMP EAX,ECX指令并修改EAX和ECX的 值,让它们相等。 按下F7键,可以看到EAX和ECX的值并没有 改变,但是相减的结果是零标志位Z被置 为了1,我们在OD来看一个例子。 实际上,我们并不关心相减的确切结果, 我们只关心EAX和ECX是否相等。 虽然我们还没有介绍条件跳转,这里简单 提一下,有两种可能性:根据标志的值来 决定跳转还是不跳转。最简单的例子就是 配合JZ指令,如果Z标志被置为1,就跳转 ,否则,就不跳转。 如果有两个序列号做比较,例如EAX存放 的是你输入的序列号,ECX存放的是正确 的序列号,该程序使用CMP指令来比较, 如果它们两个是相等的,那么零标志位Z 就置为1,后面JZ指令就会跳转到注册成 功的部分。如果EAX不等于ECX的话,那么 零标志位就会置0,那么就不会跳转到注 册成功的部分。 让我们来看看有关条件跳转的一个更具体 的例子。 符号标志位S是比较第一个操作数是否大 于第二个操作数。 让我们来看下面的例子: 重新写入CMP EAX,ECX指令,但是现在要 求是EAX的值要大于ECX的值。 按下F7键: 可以看到,零标志位Z是0,所以我们知道 ,这两个值并不相等,并且符号标志位S 也等于0,我们就可以得知EAX-ECX结果是 正的。也就说明EAX大于ECX。 依然是CMP EAX,ECX指令,但这次是EAX小 于ECX。 然后按下F7键: 这里我们可以看到,EAX减去ECX的结果是 负的,也就是说ECX大于EAX。所以符号标 志位S被置为了1。 根据比较的不同结果来设置相应的标志位 ,来决定程序应该走哪个分支。此外,CM P指令还允许寄存器与BYTE, WORD,DWORD类型的内存单元的值做比较。 这里,该指令是比较的EAX和405000内存 单元的值,跟之前一样,我们在OD来看看 解释窗口。 这个例子里面,EAX是小于405000内存单 元中的值的,405000内存单元中的值是10 00,相减的结果为负的,所以符号标志位 S会被置1。 类似的例子还有 CMP AX,WORD PTR DS:[405000] 和 CMP AL,BYTE PTR DS:[405000] 这两种情况下分别是与BYTE,WORD类型的 内存单元的值做比较。 TEST (逻辑比较) 该指令在一定程序上和CMP指令时类似的 ,两个数值进行与操作,结果不保存,但 是会改变相应标志位 (比如说,SF,ZF,PF 标志位),程序可以根据结果来决定是否 跳转到相应的分支。 下面有几个例子: TEST EAX,EAX 你会说,如果EAX与自己做比较呢?用这 个指令,可以确定EAX是否等于0。 我们在OD中写入下面的指令: TEST EAX,EAX 与操作的表如下: 1 and 1 1 1 and 0 0 0 and 1 0 0 and 0 0 上表中结果为0的只有一种情况,只有当 两个数都为0的情况 (我们并不关心操作数 的值是多少,因为我们是EAX与自身操作 ,它们永远是相等的),但是如果EAX的二 进制某些位为1的话,那么运算的结果就 不为零。 我们将EAX修改为0。 OD中在寄存器上单击鼠标右键选择零。 现在按下F7键。 我们看到,零标志位被置1了,两个0做与 操作,结果为0,所以零标志位被置1。 如果我们将EAX改为非零值,然后重复上 面的操作呢。 按下F7键。 零标志位没有被置1的话,就说明结果不 等于0。 如果你使用计算器的话,可以计算出390 AND 390结果依然是390,二进制为111001 0000。 因为位与运算中,如果两个操

文档评论(0)

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

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

1亿VIP精品文档

相关文档