使用OllyDbg从零开始Cracking第三十章PCODE.docVIP

使用OllyDbg从零开始Cracking第三十章PCODE.doc

  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从零开始Cracking第三十章PCODE

第三十章-P-CODE-Part2 (本章CrackMe支持库MSVBVM50.DLL) 本章我们继续讨论P-CODE。 以下是我从JBDUC的教程里收集的一些操作码: 6c → ILdRf 将指定操作数压入堆栈 1b → LitStr5 将字符串压入堆栈 fb → Lead0 30 → EqStr 比较两个字符串(与Lead0配合使用) 2f → FFree1Str 释放内存空间 1a → FFree1Ad 释放内存空间 0f → VCallAd 通过虚拟机运行操作码 1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ) 1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ) 1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP) fc → Lead1 c8 → End 终止程序(与Lead1配合使用) f3 → LitI2 将立即数压入堆栈 f4 → LitI2_Byte 将指定数据转化为字节整型并压入堆栈 70 → FStrI2 将栈顶的WORD型元素保存到内存单元中,然后执行出栈操作 6b → FLdI2 将WORD型参数压入堆栈 a9 → AddI2 栈顶两个WORD型元素相加,相加的结果置于栈顶 ad → SubI2 栈顶两个WORD型元素相减,相减的结果置于栈顶 b1 → MulI2 栈顶两个WORD型元素相乘,相乘的结果置于栈顶 好了,以上列出了一些操作码以及相应的含义,这里还有一份P-Code_OPCODES文档,这份文档是关于VB P-CODE虚拟机的说明文档,其阐述了操作码的解析原理(但是并不全,嘿嘿)。如果大家遇到了不熟悉的操作码的话,可以参考一下该文档,可能有帮助。 好了,这里我们首先来讲解clave2这个CrackMe,将其加载到ExDec看看都显示些什么。 这里我们可以看到开始于401CC0处,这里不能完全依然于ExDec,因为有时候它的分析不怎么准确,所以我们还是像上一章节一样手工来定位第一个操作码吧。 我们定位到入口点上面的API函数MethCallEngine。 这里我们给JMP MethCallEngine这一行设置一个断点,为了防止还有其他地方调用MethCallEngine,我们在JMP MethCallEngine这条指令上面单击鼠标右键选择-Follow定位到MethCallEngine的入口点,在入口点处也设置一个断点。 我们运行起来看看会不会触发刚刚设置的断点。 我们可以看到弹出了注册窗口,但是并没有触发我们设置的断点,说明在执行P-CODE之前注册窗口就产生了,可能有的程序执行PCODE在窗口产生之前,而我们这里刚好相反,其实这无关紧要,现在我们随便输入一个错误的用户名和序列号。 接着我们单击Registrar(注册)按钮,就会断在JMP MethCallEngine这一行,好,现在单击工具栏中的M按钮打开区段列表窗口定位到代码段(这里我们使用原版的OD,不用那个Patch过的OD,那个Patch过的OD对P-CODE应用程序并不奏效),对代码段设置内存访问断点。 接下来我们多运行几次,直到断在读取第一个操作码的指令处为止。 这里我们可以看到ESI指向了第一个操作码,并且该操作码将被保存到AL中。 和ExDec中显示的第一个操作码是位于401CC0处的04一致。 我们应该还记得上一章介绍过的04这个操作码是将后面紧跟的参数压入堆栈,这里该参数是EBP - 8C。 下面我们来看看P-CODE的说明文档中操作码是如何解析的,如下图: 04 567B 0B8E 2 1 2 就是将一个参数压入堆栈, 0B8E指的是对应参数的RVA(相对虚拟地址), 第一个2指的是所有参数所占的总字节数,接下来的一个1指的是参数的个数,最后的一个2指的是单个参数所占的字节数,由于这个例子只有一个参数,所以最后只有一个2,如果具有多个参数的话,后面会依次显示各个参数所占的字节数。 我们这里的第一个操作码所执行的操作即PUSH EBP - 8C,继续看下面的操作码,但是本章我们不跟上一章那样从头到尾跟踪每个操作码,这里我们只跟踪关键的操作码。 我们看到这两处VCALLHresult,都是读取文本框中用户输入的信息,第一个有可能是读取用户输入的用户名,第二个可能是读取用户输入的序列号,我们直接给401D4C地址处的操作码设置内存访问断点。 接着我们运行起来。 断了下来,继续往下跟踪直到读取下一个操作码的指令为止。 这里我们跟到了读取下一个操作码的指令处。 可以看到

文档评论(0)

kabudou + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档