使用OllyDbg从零开始Cracking-19第十九章-OllyDbg反调试之IsDebuggerPresent.pdfVIP

使用OllyDbg从零开始Cracking-19第十九章-OllyDbg反调试之IsDebuggerPresent.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文档。上传文档
查看更多
第十九章-OllyDbg反调试之IsDebuggerP resent 本章开始,我们将讨论反调试的相关话题, 包括手工以及通过OD插件来绕过对应的反 调试的技巧。很多程序会检测自身是否正 在被调试,如果检测到正在被调试的话,就 会结束自身进程或者不按常规流程运行。 所以绕过程序对OD的检测是很有必要的。 本章就介绍使用API函数-IsDebuggerPres ent检测OD,这也是最常用的检测调试器的 方法。 这里,我们使用Crackme1.exe来讲解,用OD 加载它。 我们记得我们的OD只安装了命令栏插件, 并没有安装绕过IsDebuggerPresent检测 的插件,那么是如何使用IsDebuggerPrese nt来检测OD的呢? 如果我们按F9键让程序运行起来,我们会 发现并没有弹出CrackMe窗口,程序直接终 止了。 OD的左下方显示程序已经终止,所以,我们 看不到窗口出现,嘿嘿。该CrackMe可能使 用的是最常见的API函数IsDebuggerPrese nt来检测是否被调试的。 重启该CrackMe,通过单击鼠标右键选择Se arch for-Name(label) in current modu le查看API函数列表,看看是否使用了IsDe buggerPresent。 我们看看API函数列表 使用了IsDebuggerPresent,嘿嘿。 我们对该函数设置一个断点,看看该Crack Me哪里使用了这个函数。 我们运行起来,马上就断在该函数的入口 处了。 根据堆栈窗口中的信息来看,该API函数没 有参数,它干的唯一的事情就是检测当前 程序是否正在被调试,如果你对该函数还 有什么疑问,可以查看MSDN。 这里解释了该函数的功能,我们来翻译一 下。 IsDebuggerPresent表示在被调试器调试 情况下,调用该函数会返回正在被调试。 并且该函数是被Kernel32.dll导出的,该 函数没有参数,如果当前程序正在被调试 的话,返回值为1,没有被调试的话,返回值 为0。 这是非常重要的信息,我们执行到返回,看 看返回值是多少。 我们停在了RET指令处,看看寄存器的情况 。 EAX的值变成了粉红色,表示EAX的值被修 改过,跟其他API函数一样,IsDebuggerPer sent的返回值也保存在EAX中,这里EAX为1 ,表示当前程序正在被调试。 我们尝试手动将EAX修改为0,表示当前程 序没有被调试,看看会发生什么。 运行起来。 再次断在了该API函数入口处,我们执行到 返回,然后将EAX的值修改为0。 我们可以看到该程序启动时的检测是基于 IsDebuggerPresent这个API函数的,我们 重新运行CrackMe,会断在IsDebuggerPers ent处,相应返回值的解释可以参考MSDN。 我们可以执行到返回,也可以直接F8单步 到RET指令,因为这个函数很简短,就几条 指令。 这里到了RET指令处,EAX的值为1,按F8键 返回。 这里我们可以看到,IsDebuggerPersent的 调用是位于uxtheme.dll模块中的,我们运 行起来,会第二次断在IsDebuggerPresent 的入口处。 这是第二次断在这里了,我们执行到返回, 接着F8键返回到上层调用处。 我们可以看到返回到了4011A9地址处,这 里有一个条件跳转JE指令,判断EAX的值是 否为0。 可以看到如果EAX不等于0,跳转将不会发 生。如果EAX为0,条件跳转发生,程序将继 续执行GetDlgItem函数,读取CrackMe窗口 的信息。 在这里条件跳转不会发生,接着执行后面 的无条件跳转JMP指令。 继续跟,我们到了这里。 这里调用了PostQuitMessage这里API函数 ,我们看下MSDN中关于该函数的说明。 MSDN上说该API函数给线程消息队列发送 一个WM_QUIT消息来关闭窗口。 执行完该函数后返回: 如果大家耐心的继续跟的话,就会发现该 程序会调用ExitProcess函数来结束进程 。(如果大家不想一步步的跟的话,可以直 接给ExitProcess函数设置一个断点,然后 运行起来,会发现断在了ExitProcess函数 处) 所以,我们可以看出IsDebuggerPresent的 返回值决定了程序是继续运行还是结束。 重新运行程序又到了该条件跳转指令JE处 ,一种方案是我们可以给该程序打补丁。 这里,我们可以将

文档评论(0)

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

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

1亿VIP精品文档

相关文档