使用OllyDbg从零开始Cracking-07第七章-call ret.pdfVIP

使用OllyDbg从零开始Cracking-07第七章-call ret.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文档。上传文档
查看更多
第七章-call和ret 我故意把call和ret指令留到这个部分来 讲,因为你们必须得弄明白前面的基础知 识,有了前面的基础,我们现在来介绍call 和ret。 尽管这两条指令看起来很简单,但是很多 初学者并不能完全领会这两条指令的本质 。所以我把它们作为一个单独的章节来介 绍,我认为这样做是可取的。 让我们继续用OD载入CrueHead а的Crack Me。 在任意一行点击鼠标右键选择- “Go to” - “Expression”。 在弹出的对话框中输入401245。 直接跳转到一个反汇编代码的地址处,这 里有一个Call指令,我们拿它来练习。 我们在练习的这个Call指令上面单击鼠标 右键选择- “New origin here”。现在,E IP的值就变成了401245,这就意味着下一 条要执行的指令就是我们的这个Call指令 。 我们将看到EIP被修改了。 我们回到我们Call指令这里。 Call指令是将转移到指定的子程序处,它 的操作数就是给定的地址。例如: Call 401362表示将转移到地址401362处, 将调用401362处的子程序,一旦子程序调 用完毕就返回到Call指令的下一条语句处 。 在这种情况下,完成401362的子程序调用 以后,则会返回到40124A地址处。 针对于call指令,OD提供了一些有用的跟 踪机制。如果想继续跟进子程序内部,你 可以按F7键跟进。如果只是想先看看子程 序里面的内容再决定要不要跟进的话,可 以单击鼠标右键- “Follow”。最后,如 果我们不想继续跟踪该子程序了,我们可 以按下F8键,继续执行call指令的下一条 语句。 OD允许我们看我们感兴趣的子程序里面的 内容,但是不执行,只需要在call指令上面 单击鼠标右键选择 “Follow”。 正如你所看到的,EIP的值仍然是401245。 “Follow”按钮只是简单的将指定地址处 代码反汇编,但是并不会执行代码,并且等 待我们进一步的操作。 我们这个子程序起始地址是401362,那么 哪里是子程序的结束呢?这里我们下面第 一个出现的ret指令就是子程序的结束。O D中还可以写成retn。执行完ret指令以后 ,程序就会返回到call指令的下一条指令4 0124A处。 现在我们知道了怎么查看子程序里面代码 了,如果我们想回到之前的那一行的话,我 们可以按数字键减号。这个键可以让我们 回到按 “Follow”的那一行。 在这里,我们可以看到原先的call指令: 现在我们将按F7键跟进这个子程序,首先 我们来看看堆栈的情况。这一步很重要, 为了让子程序执行完ret指令后,知道要返 回到哪里,返回地址将要存到堆栈当中。 上一张图片显示是我机器上的栈中的内容 。或许跟你机器上的不一样,这无关紧要 。 按F7键: 现在跟进子程序里面了,可以看到不像上 面的 “Follow”操作,现在EIP的值已经改 变了-现在它等于401362,这就说明我们真 正开始执行代码了。 让我们继续把注意力转移到堆栈中。 这张图片高亮显示的部分是我们跟进子程 序之前的情况,现在我们有了一个新的元 素,即call指令的下一条指令的地址被压 入了堆栈中作为返回地址。 40124A这个地址就是call指令的下一条指 令的地址,如果你不记得了,我们来call指 令处看看。 OD还为我们提供了一些额外的信息。 红色的提示信息告诉我们,40124A就是以4 01262为起始地址的子程序的返回地址。 但是OD仍然不知道ret指令在哪里,但是知 道401362是子程序的起始地址,当执行完r et指令后就会返回到40124A地址处。 我们继续按F7键,执行push 0指令,看看这 个0是不是压入堆栈中并且存放到返回地 址的上面了。 这个程序可能包含了成千上万个堆栈操作 (push,pop等),在堆栈中添加或者删除了 各种各样的值,但是当我们执行到ret指令 的时候,栈顶存放的一般是子程序的返回 地址。我们一直按F8不跟进call指令里面 ,直到遇到了ret指令停止。 现在我们到了子程序末尾的ret指令了,这 个时候栈顶存放的是子程序的返回地址。 因此,我们可以知道ret指令是子程序的结 束,也就是说,如果我们call跟进的话,那 么ret就能返回到call指令的下一条语句 处。 按F7键: 现在返回到了40124A处了,堆栈也恢复到 了调用call指令之前的状态。 我这里补充一点,ret指令可不仅仅用于子

文档评论(0)

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

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

1亿VIP精品文档

相关文档