- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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地址处的操作码设置内存访问断点。
接着我们运行起来。
断了下来,继续往下跟踪直到读取下一个操作码的指令为止。
这里我们跟到了读取下一个操作码的指令处。
可以看到
您可能关注的文档
最近下载
- 普通高中音乐课程标准(2017年版2020年修订).docx
- T_JSFPSA -001-2022_全麦面包_标准.pdf VIP
- GB50702-2011砌体结构加固设计规范.docx VIP
- 《特高压电力管廊盾构隧道结构施工及运营期验收评估标准》.pdf VIP
- 15、推理综合 举一反三 2024—2025学年度 小学二年级奥数 教学课件PPT.pptx VIP
- 项目式学习在小学英语教学中的实践教学研究课题报告.docx
- matlab课件(西工大-孙蓬).pptx
- 香港上市(IPO)全流程介绍(最完整版).pdf VIP
- GBT50319-2013建设工程监理规范表格-全部[整理].doc VIP
- 09S302雨水斗选用及安装图集(清晰).pdf VIP
文档评论(0)