使用OllyDbg从零开始Cracking-47第四十七章-Patrick的CrackMe-Part2.pdfVIP

使用OllyDbg从零开始Cracking-47第四十七章-Patrick的CrackMe-Part2.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文档。上传文档
查看更多
第四十七章-Patrick的CrackMe-Part2 我们接着上一章的继续讲,上一章的结尾 处我们是通过如下方式来附加新创建的进 程的,首先将NTDLL.DLL中调用其他模块的 入口点那一条指令设置为一个死循环,然 后将OD设置为即时调试器 (JIT),接着打开 任务管理器,选中新创建的进程单击鼠标 右键选择调试,这样OD就附加了新创建的 进程。接着在死循环的指令处设置一个断 点,然后将Patch过的字节码恢复为原始字 节,然后直接按F9键运行两次后,模块列表 窗口中就会出现AntiDebugDll.dll了,接 着我们给AntiDebugDll.dll的代码段设置 内存访问断点,然后删除掉之前设置的INT 3断点,运行起来,这样就可以断在AntiDeb ugDll.dll的入口点处了。 现在我们打开了两个OD,其中一个被调试 的为父进程,另一个被调试的为子进程。 现在父进程处于CreateProcessA调用语句 的返回地址处。 子进程处于AntiDebugDll.dll的入口点处 。这里我将调试子进程的OD换了一种配色 方案,这样可以防止大家在阅读的时候将 两个OD搞混淆了。 理论上来说,现在我们需要同时模拟执行 这两个进程,但实际上我们无法做到同时 调试。我们只能够分别协同调试两个进程 。 我们知道父进程中调用CreateMutexA这个 函数,这里我们给子进程的中CreateMutex A也设置一个断点。 我们运行起来,断在了这里,这里由于父进 程已经创建了MYFIRSTINSTANCE这个互斥 体,所以我们如果执行了该函数,GetLastE rror的错误码将返回0xB7,即ERROR_ALREA DY_EXISTS。这里我们执行到返回验证一 下。 这里我们可以看到LastErr为ERROR_ALREA DY_EXISTS,即0xB7。表示互斥体已经存在 。 接着这里调用RtlGetLastWin32Error获取 错误码,这里错误码我们已经知道了是0xB 7了,即ERROR_ALREADY_EXISTS。 这里将错误码保存到10010ECC指向的内存 单元中,我们给该内存单元设置一个内存 访问断点,运行起来。 断在了这里,这里是读取该错误码进行比 较。 这里将RtlGetLastWin32Error返回的错误 码与0xB7做比较。 接着如果相等的话,通过SETE指令将EAX置 1,这里明显错误码等于0xB7,所以EAX被置 1,如果是父进程的话,EAX会被置0。 接着我们返回到了这里,子进程中1000262 C这处条件跳转将成立,而父进程此处跳转 将不会成立。所以之后父进程与子进程将 执行不同的分支流程,有待我们进一步分 析。 这里有没有觉得这样一点点单步跟踪有点 麻烦? 其实有网上很多好用的API监视工具,比如 说KAM,APISPY,这些工具可以记录程序中 执行了哪些API函数,不需要我们一步步的 跟踪,可以节省很多时间。 这里其实我们可以利用内存访问断点间接 的完成API函数的监视工作,不需要这样一 步步单步跟踪。具体操作如下: 首先我们需要定位子进程中AntiDebugDll .dll这个模块的IAT,这里我们将反汇编窗 口往上拉,随便找一个API函数调用处。 我们可以看到100024B5处调用了WideChar ToMultiByte这个API函数,该API函数的指 针位于1000C034地址处,它是AntiDebugDl l.dll的IAT中的一项。我们在数据窗口中 定位到该IAT项。 这里就是IAT了,我们定位到该IAT的起始 位置和结束位置,然后选中整个IAT,单击 鼠标右键选择Breakpoint-Memory,on acc ess,给整个IAT设置内存访问断点。 接下来我们同样给父进程的AntiDebugDll .dll的整个IAT表设置内存访问断点。 这里我们就给父子进程的AntiDebugDll.d ll的IAT都设置了内存访问断点,也就说当 程序中调用AntiDebugDll.dll模块IAT中 的API函数时就会断下来,这里还需要注意 一点,有可能该Dll会通过调用GetProcAdd ress来获取其他的API函数指针,所以这里 我们给GetProcAddress也设置一个断点, 以防万一。 好了,现在我们继续调试子进程,我们按F9 键运行起来,看看调用哪些API函数。 断在了这里,这里要创建MYMAININSTANCE 这个互斥体,这个互斥体之前未被创建过 。 大家应该还记得之

文档评论(0)

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

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

1亿VIP精品文档

相关文档