使用OllyDbg从零开始Cracking 第二十九章-P-CODE
使用OllyDbg从零开始Cracking 第三十章PCODE
![使用OllyDbg从零开始Cracking 第三十章PCODE](https://img.taocdn.com/s3/m/8bb517d450e2524de5187ebf.png)
第三十章-P-CODE-Part2(本章CrackMe支持库MSVBVM50.DLL)本章我们继续讨论P-CODE。
以下是我从JBDUC的教程里收集的一些操作码:6c → ILdRf 将指定操作数压入堆栈1b → LitStr5 将字符串压入堆栈fb → Lead030 → EqStr 比较两个字符串(与Lead0配合使用)2f → FFree1Str 释放内存空间1a → FFree1Ad 释放内存空间0f → VCallAd 通过虚拟机运行操作码1c → BranchF 条件跳转指令,如果栈顶的值为false则跳转(相当于汇编指令JNE/JNZ)1d → BranchT 条件跳转指令,如果栈顶的值为true则跳转(相当于汇编指令JE/JZ)1e → Branch 无条件跳转(嘿嘿,相当于汇编指令JMP)fc → Lead1c8 → 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,因为有时候它的分析不怎么准确,所以我们还是像上一章节一样手工来定位第一个操作码吧。
OllyDBG新手使用说明书
![OllyDBG新手使用说明书](https://img.taocdn.com/s3/m/24f99f2369eae009591bec5c.png)
OllyDBG 新手使用说明书OLLYDBG完全教程(一)一、什么是 OllyDbg ?OllyDbg 是一种具有可视化界面的 32 位汇编 - 分析调试器。
它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
Version 1.10 是最终的发布版本。
这个工程已经停止,我不再继续支持这个软件了。
但不用担心:全新打造的OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的Windows 95、98、ME、NT或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用 300-MHz以上的奔腾处理器以达到最佳效果。
还有, OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[ Trace ]之类的扩展功能话,建议您最好使用 128MB以上的内存。
支持的处理器:OllyD 的数据格式,但是不支持SSE2 指令集。
bg 支持所有80x86、奔腾、 MMX、3DNOW!、 Athlon 扩展指令集、 SSE指令集以及相关配置:有多达百余个(天呀!)选项用来设置OllyDbg 的外观和运行。
数据格式: OllyDbg 的数据窗口能够显示的所有数据格式: HEX、ASCII 、UNICODE、 16/32 位有 / 无符号 /HEX 整数、32/64/80 位浮点数、地址、反汇编( MASM、IDEAL或是 HLA)、PE文件头或线程数据块。
帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。
如果您还有 Windows API帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。
启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到 OllyDbg 中,或者重新启动上一个被调试程序,或是挂接[ Attach ]一个正在运行的程序。
OllyDbg入门完全教程(完美排版)
![OllyDbg入门完全教程(完美排版)](https://img.taocdn.com/s3/m/86dbb80bfd0a79563c1e72cd.png)
OllyDbg完全教程目录第一章概述 (1)第二章组件 (5)一、一般原理[General prnciples] (5)二、反汇编器[Disassembler] (8)三、分析器[Analysis] (9)四、Object扫描器[Object scanner] (12)五、Implib扫描器[Implib scanner] (12)第三章 OllyDbg的使用 (13)一、如何开始调试[How to start debugging session] (13)二、CPU 窗口[CPU window] (14)三、断点[Breakpoints] (14)四、数据窗口[Dump] (15)五、可执行模块窗口[Executable modules window] (16)六、内存映射窗口[Memory map window] (17)七、监视与监察器[Watches and inspectors] (19)八、线程[Threads] (19)九、调用栈[Call stack] (20)十、调用树[Call tree] (21)十一、选项[Options] (21)十二、搜索[Search] (22)十三、自解压文件[Self—extracting (SFX) files] (22)十四、单步执行与自动执行[Step—by—step execution and animation] (23)十五、Hit跟踪[Hit trace] (23)十六、Run 跟踪[Run trace] (24)十七、快捷键 (26)十八、插件[Plugins] (29)十九、技巧提示[Tips and tricks] (29)第四章其他功能 (30)一、调试独立的DLL[Debugging of stand—alone DLLs] (30)二、解码提示[Decoding hints] (32)三、表达式赋值[Evaluation of expressions] (32)四、自定义函数描述[Custom function descriptions] (34)第一章概述OllyDbg 是一种具有可视化界面的32 位汇编—分析调试器。
外挂编写必备工具2OllyDBG (OD)入门系列
![外挂编写必备工具2OllyDBG (OD)入门系列](https://img.taocdn.com/s3/m/1a6eaaef5ef7ba0d4a733bf8.png)
00440F70 |. EB 32 JMP SHORT CrackMe3.00440FA4
00440F72 |> 6A 00 PUSH 0
OllyDBG中各个窗口的功能如上图。简单解释一下各个窗口的功能,的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于SoftICE中的F11)
外挂编写必备工具2——OllyDBG(OD)入门系列2
OllyDBG入门系列(二)-字串参考
上一篇是使用入门,现在我们开始正式进入破解。今天的目标程序是看雪兄《加密与解密》第一版附带光盘中的镜像打包中的CFF Crackme #3,采用用户名/序列号保护方式。原版加了个UPX的壳。刚开始学破解先不涉及壳的问题,我们主要是熟悉用OllyDBG来破解的一般方法。我这里把壳脱掉来分析,附件是脱壳后的文件,直接就可以拿来用。先说一下一般软件破解的流程:拿到一个软件先别接着马上用OllyDBG调试,先运行一下,有帮助文档的最好先看一下帮助,熟悉一下软件的使用方法,再看看注册的方式。如果是序列号方式可以先输个假的来试一下,看看有什么反应,也给我们破解留下一些有用的线索。如果没有输入注册码的地方,要考虑一下是不是读取注册表或Key文件(一般称keyfile,就是程序读取一个文件中的内容来判断是否注册),这些可以用其它工具来辅助分析。如果这些都不是,原程序只是一个功能不全的试用版,那要注册为正式版本就要自己来写代码完善了。有点跑题了,呵呵。获得程序的一些基本信息后,还要用查壳的工具来查一下程序是否加了壳,若没壳的话看看程序是什么编译器编的,如VC、Delphi、VB等。这样的查壳工具有PEiD和FI。有壳的话我们要尽量脱了壳后再来用OllyDBG调试,特殊情况下也可带壳调试。下面进入正题:
OllyDBG完美教程
![OllyDBG完美教程](https://img.taocdn.com/s3/m/f1345fd0d15abe23482f4db9.png)
OllyDBG完美教程(超强入门级)关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。
启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
第三章:OllyDbg的使用(上)
![第三章:OllyDbg的使用(上)](https://img.taocdn.com/s3/m/c982a97348d7c1c708a145fe.png)
教程三:OllyDbg的使用(上)本章中我将会介绍OllyDbg的使用。
Olly有许多的功能,唯一学好它们的方式是实践和练习。
也就是说,本教程也只是给你一个简单的概述。
此教程不会涉及额外的内容,后面会进行重点讨论。
到最后,你应该会比较好的掌握Olly。
本章包含了一些文件。
你能够下载那些文件,以及可以在这里下载到次教程的PDF版本。
它们包括一个我们将在Olly中用到的二进制文件、一个Olly备忘单、我使用的外观上有些不同的Olly以及一个新的ini文件。
你可以用这个ini文件替换掉Olly默认的ini,可以给新人提供一些帮助(感谢伟大的Lena151做的这些)。
你可以从这里直接下载或者从教程页面下载。
如果你更愿意用原版的Olly,你可以从这里下载。
一、载入应用第一步是将目的二进制文件载入Olly。
你可以将二进制文件拖放到Olly的反汇编窗口,或者点击顶部工具栏中的载入图标选择目的文件。
我们这里载入“FirstProgram.exe”,可以从本网站下载。
Olly会进行分析(Olly的底部状态栏会显示分析进程)然后停在程序的入口点(EP):需要注意的第一件事是EP的地址是401000,就是图片中的第一列。
这是可执行文件的一个相当标准的起点(该可执行文件至少没有加过壳或混淆过)。
如果你的看起来不太一样,并且Olly没有停在401000,你可以尝试点击Appearance菜单,然后选择debugging options,点击“Events”标签,并且确保“WinMain(if location is known)”被勾选上。
然后重启应用。
让我们给“FirstProgram.exe”的内存空间占用情况来张快照。
点击“Me”图标(如果你使用的是不同版本的Olly的话应该是“M”):如果你看地址那一列,你会看到401000那行包含有大小1000、名称“FirstPro”(FirstProgram的简写形式)、区块名“.text”、包含里是“SFX,code”。
ollydbg的使用教程
![ollydbg的使用教程](https://img.taocdn.com/s3/m/f792fd2b366baf1ffc4ffe4733687e21af45ff20.png)
ollydbg的使⽤教程教程四:OllyDbg的使⽤(下)⼀、简介此次教程我们继续学习Olly的使⽤。
我们将继续使⽤上⼀章的程序(我也会将它包含在下载⾥)。
你可以在tutorials中下载⽂件和PDF版的教程。
⼆、DLLS就像我前⾯说的,当你启动程序时,DLL被系统载⼊器载⼊。
这回我会细致的讲解。
DLL (Dynamic Link Libraries)是函数的集合,通常由Windows提供(当任何⼈都可以提供),其中含有很多Windows程序要⽤的函数。
这些函数可以让程序员更容易的完成⼀些乏味的重复性的任务。
例如,将字符串全部转换成⼤写是许多程序要实现的功能。
如果你的程序要多次使⽤该功能的话,你有三个选择:⼀是在你的程序中⾃⼰编码实现;问题是,你不知道你的下⼀个程序是不是也会⽤到该功能很多次。
你可能需要在你使⽤到的程序⾥复制粘贴很多次相同的代码。
⼆是创建⼀个⾃⼰的库,这样任何程序都可以调⽤。
这种情况下,你可以创建⼀个DLL,然后包含在程序中。
该DLL可能有像convertToUpper这样的通⽤函数以便于程序调⽤,因此你只需要写⼀次代码就⾏了。
这样做的另⼀个好处是,你可以说你为字符串转⼤写想到了⼀个很好的优化⽅案。
第⼀个例⼦中,你需要将代码拷贝到所有要⽤到该代码的程序中,但是在那个通⽤DLL例⼦中,你只需要修改DLL的代码,然后所有使⽤该DLL的程序都可以以最快的速度获益。
爽吧!这就是DLL产⽣的真正原因。
最后⼀个选择是,使⽤Windows提供的⼀堆DLL中包含的数千个函数中的⼀个。
这样做有很多好处。
第⼀个是,Microsoft的程序员已经花了多年时间来优化他们的函数,他们在很⼤程度上要⽐你⽜逼。
第⼆,你不需要将你的DLL包含在应⽤中,因为Windows操作系统已经内建了这些DLL。
最后,如果Windows决定修改他们的操作系统,你⾃⼰的DLL有可能和新系统不兼容。
同时,如果你使⽤Windows的DLL,它们肯定是兼容的。
OllyDbg的基本使用
![OllyDbg的基本使用](https://img.taocdn.com/s3/m/94cce56e5bcfa1c7aa00b52acfc789eb172d9ec5.png)
OllyDbg的基本使⽤注:内容整理⾃《逆向⼯程核⼼原理》,结合我的OllyDbg版本修改了⼀些内容1. OllyDbg常⽤命令及其快捷键指令快捷键含义Restart Ctrl+F2重新开始调试Step Into F7执⾏⼀句OP code,若遇到CALL,进⼊函数代码内部Step Over F8执⾏⼀句OP code,若遇到CALL,仅执⾏函数⾃⾝,不跟随进⼊Run F9运⾏(遇到断点时暂停)Execute till return Ctrl+F9 执⾏函数代码内的命令,直到遇到RETN命令,⽤于跳出函数体Execute till cursor F4 执⾏到光标所在位置Comment; 添加注释User-defined comment⿏标右键菜单Search for-User defined comment查看⽤户输⼊的注释⽬录Label:添加标签User-defined label⿏标右键菜单Search for-User defined Label查看⽤户输⼊的标签⽬录Breakpoint F2设置或取消断点All referenced text strings ⿏标右键菜单Search for-All referenced textstrings查看代码中引⽤的字符串All intermodular calls⿏标右键菜单Search for-All intermodular calls查看代码中调⽤的所有API函数Name in all modules⿏标右键菜单Search for-Name in all modules查看所有API函数Edit data Ctrl+E编辑数据Assemble空格键编写汇编代码Copy to executable file⿏标右键菜单Copy to executable file创建⽂本副本(修改的项⽬被保留)2. 设置点的⽅法(这⾥我们假设⼤本营的地址为004010ED)①Goto命令执⾏Goto命令(Ctrl+G),在打开的对话框中输⼊004010ED,然后单击OK按钮,这样光标就会⾃动定位到004010ED处然后执⾏Execute till cursor(F4)命令,让调试流运⾏到该处②设置断点选中004010ED这⼀⾏(可以⼿动找,也可以使⽤上述Goto命令中的第⼀步),设置BreakPoint(F2),调试运⾏到断点处会暂停然后执⾏Run debugged application(F9)即可让调试直接运⾏到断点处暂停注:在OllyDbg菜单栏中选择View-Breakpoints(Alt+B),可以打开Breakpoints对话框,列出代码中设置的断点。
Ollydbg使用方法和技巧
![Ollydbg使用方法和技巧](https://img.taocdn.com/s3/m/4600bcd176a20029bd642d81.png)
如果有寄存器参数,OllyDbg还是不认识也不包括在上面的统计中。分析器采用了
一个安全的方法。例如,它不分辨无参数过程和返回前用POP恢复寄存器代替舍弃
参数的case语句。然而,能分辨出的函数数目相当多,并非常有助于提高代码的
Alt+X-中断OllyDbg。
多数窗口可以使用下列快捷键:
Alt+F3--关闭活动窗口。
Ctrl+F4--关闭活动窗口。
F5--最大化或恢复活动窗口。
F6--激活下一个窗口。
Shift+F6--激活前一个窗口。
F10--打开激活窗口或面板的右键菜单。
LeftArrow--左移一个字符。
这些快捷键在OllyDbg中通用,不依赖于当前活动窗口。
Ctrl+F2---OllyDbg重置,重新开始调试。如果没有活动程序,OllyDbg装入历史列表中的第一个程序。OllyDbg重置会释放内存移除硬断点。
Alt+F2--关闭被调试的程序。如果程序还在活动状态,你会被询问是否执行该操作。
F3--显示“Open 32-bit .exe file”对话框,这里可以选择可执行文件和指定参数
WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列不修改寄存器(只
由比较命令构成),那么不大可能是switch语句,但可能是if嵌套:
if (i==0) {...}
else if (i==5) {...}
else if (i==10) {...}
让OllyDbg解码if嵌套为switch,选择Analysis1中相应的选项。
Ollydbg2.0x简明帮助手册
![Ollydbg2.0x简明帮助手册](https://img.taocdn.com/s3/m/4b51eac276eeaeaad1f330b8.png)
OllyDbg 2.01 简明帮助手册Translated by Antiy Cert免责声明本译文译者为安天实验室工程师,本文系出自个人兴趣在业余时间所译,本文原文来自互联网的公共方式,译者力图忠于所获得之电子版本进行翻译,但受翻译水平和技术水平所限,不能完全保证译文完全与原文含义一致,同时对所获得原文是否存在臆造、或者是否与其原始版本一致未进行可靠性验证和评价。
本译文对应原文所有观点亦不受本译文中任何打字、排版、印刷或翻译错误的影响。
译者与安天实验室不对译文及原文中包含或引用的信息的真实性、准确性、可靠性、或完整性提供任何明示或暗示的保证。
译者与安天实验室亦对原文和译文的任何内容不承担任何责任。
翻译本文的行为不代表译者和安天实验室对原文立场持有任何立场和态度。
译者与安天实验室均与原作者与原始发布者积极联系未果,亦未获得相关的版权授权,鉴于译者及安天实验室出于学习参考之目的翻译本文,而无出版、发售译文等任何商业利益意图,因此亦不对任何可能因此导致的版权问题承担责任。
本文为安天内部参考文献,主要用于安天实验室内部进行外语和技术学习使用,亦向中国大陆境内的网络安全领域的研究人士进行有限分享。
望尊重译者的劳动和意愿,不得以任何方式修改本译文。
译者和安天实验室并未授权任何人士和第三方二次分享本译文,因此第三方对本译文的全部或者部分所做的分享、传播、报道、张贴行为,及所带来的后果与译者和安天实验室无关。
本译文亦不得用于任何商业目的,基于上述问题产生的法律责任,译者与安天实验室一律不予承担。
注:如有原作者联系方式或信息请与我们联系。
前言Ollydbg是一款结合IDA和SoftICE功能的调试工具,因其简易的操作和强大的功能,目前已成为安全研究领域使用最广泛的调试解密工具。
目前Ollydbg软件已发布2.0x版本,但内附的帮助手册尚无中文翻译版发布。
基于合作分享,互惠互利的理念,同时为更多新版Ollydbg的使用者提供便利的条件,安天CERT对帮助手册展开翻译工作,并形成当前的译文版本。
Ollydbg使用方法
![Ollydbg使用方法](https://img.taocdn.com/s3/m/6539e308763231126edb11f2.png)
几个快捷键的作用:1、Ctrl+F2 重新开始2、F7 单步调试,遇到函数调用便进入该函数3、F8 单步调试,遇到函数调用不进入该函数4、Ctrl+F7 自动运行直到碰到断点,遇到函数调用便进入该函数5、Ctrl+F8 自动运行直到碰到断点,无断点的函数不进入OllyDbg的help-怎样开始调试(翻译)最简单的方法是启动OllyDbg,点击File|Open,然后选择你想调试的程序。
程序需要命令行参数输入对话框下方的文本栏。
重新开始调试最后一个程序的快捷键是Ctrl+F2,并且OllyDbg使用相同的参数。
你也可以点选历史记录。
把程序拖入OllyDbg也可以开始调试。
当然,当启动OllyDbg时,你在命令行中也能指定被调试的程序名和参数。
比如:你可以创建桌面快捷方式指向OllyDbg,选择属性,到快捷方式,把程序名加入目标栏。
每次你双击这个快捷图标,OllyDbg自动装载被调试程序。
你可以attach OllyDbg到某个正在运行的进程。
点击File|Attach,从列表中选择该进程。
注意:当你关闭OllyDbg,这个进程也会终止。
不要试图attach系统进程,这很可能使系统完全SI机。
(事实上,大多数情况下,OS不允许attach敏感进程)OllyDbg能作为just-in-time debugger。
这需要在注册表中登记。
点击Options|Just-in-time debugging,在对话框中按“Make OllyDbg just-in-time debugger”。
现在,当一些程序崩溃,你会被询问是否调试它。
这样,操作系统可以启动OllyDbg并直接停在异常发生处。
如果你选择attaching without confirmation,OllyDbg不会询问直接启动。
要恢复原来的just-in-time debugger,在出现的对话框中按相应的按纽就行了。
其它方法还有,把OllyDbg加入可执行文件的弹出式菜单。
使用OllyDbg从零开始Cracking
![使用OllyDbg从零开始Cracking](https://img.taocdn.com/s3/m/b4ff7136580216fc700afd8e.png)
第4章-汇编指令之前的章节主要是理论知识,现在我们要在OllyDbg中实践一下,为后面打开基础。
OllyDbg中几乎所有的标志我都有考虑,如果你遇到了我没有给出的指令,你可以查阅更加全面的汇编指南。
NOP(无操作)运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”,也就是说,它没有特殊的用途。
例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。
适当数目的nop指令可以将其他指令完全替换掉。
下面使用OllyDbg重新载入CrueHead'а(CrackMe的作者)的CrackMe。
我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble.或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。
写入NOP指令后单击Assemble按钮。
这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP 指令进行替换,而不是使用一条NOP进行替换。
现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。
现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。
在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。
这里我们需要输入401000。
红色突出显示的是刚刚修改过的字节。
前两个是90,然后E8,FF和04,00,00。
这是一个Call 指令的所有剩余字节。
OD可以撤销我们修改的指令吗?呵呵,当然啦。
在数据窗口或者反汇编窗口中,鼠标拖选中两个字节。
然后单击鼠标右键,选择“UNDO SELECTION”。
这样就恢复了原来的PUSH指令。
在数据窗口中的话,你就可以看到它原始的字节了。
使用OllyDbg从零开始Cracking 第三十一章-脱壳简介
![使用OllyDbg从零开始Cracking 第三十一章-脱壳简介](https://img.taocdn.com/s3/m/4d2d6ee519e8b8f67c1cb9bf.png)
第三十一章-脱壳简介原定本章是要介绍P-CODE的Part3,然后再介绍脱壳的。
但是很多朋友跟我说P-CODE,WKT的教程有很多,并且现在P-CODE的应用程序已经很少了,没有必要过多的介绍P-CODE,希望我能够多讲讲壳,提高大家脱壳的能力。
所以说本章我们开始讨论壳,首先要给大家明确一点,壳的种类繁多(PS:这里说种类繁多,并不准确,种类也就那么几种,压缩壳,加密壳,虚拟机壳,所以说应该是数量多,之前发过一篇帖子收集了T4社区的各种脱壳脚本,充斥着各种各样的壳,大家可以看看),所以接下来的章节,我不会介绍所有的壳,只会给大家介绍壳的基本概念以及原理,还有几个具体壳的实例,大家不要指望看完本教程将能搞定所有壳,本教程的目的在于帮助大家理解壳的原理,锻炼大家解决未知壳的能力,大家要学会举一反三,触类旁通。
本章我们将介绍壳的基本概念,这对我们后面脱壳是大有裨益的,大家不要因为简单,就忽视它,后面章节,我们会介绍一些手工脱壳的实例。
首先大家可能会问为什么要给程序加壳?(PS:其实地球人都知道,嘿嘿)我们知道一个未加壳或者脱过壳的程序修改起来很方便,但是如果一个加过壳或者自修改的程序,要想修改它就比较困难了,我们在入口点(PS:这里指的入口点是壳的入口点)处修改程序是不起作用的,只有当壳把原程序区段解密完成后修改才能起作用。
加过壳的程序,原程序代码段通常是被加密过的,我们想修改它就不那么容易了。
加壳程序给目标程序加壳的原理通常是加密/压缩原程序各个区段,并且给目标程序添加一个或者多个区段作为原程序的引导代码(壳代码),然后将原程序入口点修改为外壳程序的入口点。
如果我们将加过壳的程序用OllyDbg加载的话,OllyDbg会停在壳的解密例程的入口点处,由此开始执行。
壳的解密例程(外壳程序)首先会定位加密/压缩过的原程序的各个区段,将其解密/解压,然后跳转至OEP(程序未加壳时的入口点)处开始执行。
现在我们来看一个最简单的壳,UPX壳,大家可以去下面网址中下载一个GUI版,名称为GUiPeX_Setup。
OllyDBG入门教程
![OllyDBG入门教程](https://img.taocdn.com/s3/m/566ac9de80eb6294dd886c80.png)
OllyDBG 入门系列(一)-认识OllyDBG一、OllyDBG的安装与配置OllyDBG1.10版的发布版本是个ZIP压缩包,只要解压到一个目录下,运行OllyDBG.exe就可以了。
汉化版的发布版本是个RAR压缩包,同样只需解压到一个目录下运行OllyDBG.exe即可:OllyDBG中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考TT小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的CPU寄存器内容。
同样点击标签寄存器(FPU)可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG就可以生效了。
启动后我们要把插件及UDD的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG解压在F:\OllyDBG目录下,所以相应的UDD目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。
在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个UDD目录不清楚。
我这简单解释一下:这个UDD目录的作用是保存你调试的工作。
使用OllyDbg从零开始Cracking 第二十一章
![使用OllyDbg从零开始Cracking 第二十一章](https://img.taocdn.com/s3/m/85d4c3b782d049649b6648d7c1c708a1284a0aa6.png)
第二^一章-OllyDbg 反调试之检测OD 进程名,窗口类名,窗口标题名本章我们继续讨论反调试,将我修改过的一个CrackMe 作为本章的实验对象。
该CrackMe 的名字叫做buggers,其中做的一些修改是为了介绍检测OllyDbg 进程名的其他一些API 函数,同时该CrackMe 也涵盖 了检测OllyDbg 窗口标题名以及窗口类名等知识点。
我们打开原始的OllyDbg 程序,不使用重命名的,因为本章我们将对上一章的检测OD 的方法进行延伸,因此让OD 的文件名是OllyDbg.exe,保证该CrackMe 可以检测出来OD 。
我们用OD 加载该CrackMe,接着将HideDebugger1.23版插件的IsDebuggerPersent 选项勾选上。
这里只是为了防止该程序调用IsDebuggerPresent 对OD 进行检测。
我们打开原始的OllyDbg.exe,然后打开任务管理器,确保OD 的进程名为”O LLYDBG.EXE ,Archive Opciones Ver Apagar AyudaAplicaciones ProcesosRendimientoFunciones de red UsuariosNombre de imagen PID Nombre de us... CPU 1 Use de ...taskmgr.exe 3128 Ricardo 00 4.640 KB OLLYDBG.EXE 2680 Ricardo00 5.504 KB alg.exe2648 5ERVICIO LOCAL001.260 KB'nTi —.t,Pi i.—Fl Fl好了,我们回到buggers3,看看该程序使用了哪些API 函数。
or de tareas deows1314001 I33040013314001 5 3314001Follow in Dump View 匚all tree►Cfrl+KI Search for► Name (label) in current module Ctrl+N Find references to► Name in all modulesView►I,—'i —b m KVb -iV-ifAL+l■- l-L 匚HideDebugger 插件的配置如下:我的天啦!API 列表中居然只是唯一的一个函数ExitProcess,其他API 函数应该都是通过GetProcAddress 加载的,但是GetProcAddress 也不在该列表中。
OllyDBG破解入门教程图文
![OllyDBG破解入门教程图文](https://img.taocdn.com/s3/m/707de5ea951ea76e58fafab069dc5022aaea46c7.png)
OllyDBG破解⼊门教程图⽂⼀、OllyDBG 的安装与配置OllyDBG 版的发布版本是个 ZIP 压缩包,只要解压到⼀个⽬录下,运⾏ OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到⼀个⽬录下运⾏ OllyDBG.exe下载地址:https:///softs/58565.html即可:OllyDBG 中各个窗⼝的功能如上图。
简单解释⼀下各个窗⼝的功能,更详细的内容可以参考 TT ⼩组翻译的中⽂帮助:反汇编窗⼝:显⽰被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗⼝中右击出现的菜单界⾯选项->隐藏标题或显⽰标题来进⾏切换是否显⽰。
⽤⿏标左键点击注释标签可以切换注释显⽰的⽅式。
寄存器窗⼝:显⽰当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显⽰寄存器的⽅式。
信息窗⼝:显⽰反汇编窗⼝中选中的第⼀个命令的参数及⼀些跳转⽬标地址、字串等。
数据窗⼝:显⽰内存或⽂件的内容。
右键菜单可⽤于切换显⽰⽅式。
堆栈窗⼝:显⽰当前线程的堆栈。
要调整上⾯各个窗⼝的⼤⼩的话,只需左键按住边框拖动,等调整好了,重新启动⼀下 OllyDBG 就可以⽣效了。
启动后我们要把插件及 UDD 的⽬录配置为绝对路径,点击菜单上的选项->界⾯,将会出来⼀个界⾯选项的对话框,我们点击其中的⽬录标签:因为我这⾥是把 OllyDBG 解压在 F:\OllyDBG ⽬录下,所以相应的 UDD ⽬录及插件⽬录按图上配置。
还有⼀个常⽤到的标签就是上图后⾯那个字体,在这⾥你可以更改 OllyDBG 中显⽰的字体。
上图中其它的选项可以保留为默认,若有需要也可以⾃⼰修改。
修改完以后点击确定,弹出⼀个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动⼀下 OllyDBG,我们再到界⾯选项中看⼀下,会发现我们原先设置好的路径都已保存了。
OD(OllyDbg)使用教程
![OD(OllyDbg)使用教程](https://img.taocdn.com/s3/m/9f2246c8844769eae109edb3.png)
我们可以按Alt+B调出断点窗口,然后将GetDlgItemTextA的断点改为已禁止
接下来就在004011AE下一个断点,因为这里有调用到 GetDlgItemTextA这个函数
然后就要开始分析这些汇编代码的意义,所以,我们在使 用这个软件的时候,一定要明白这些代码的含义,现在我 们只是先认识一下这个软件的作用,所以就不为大家做出 分析,接下来就是修改代码了。其实我们要是分析下来, 可以发现,其实问题就在于一个代码行--004011F5
工具介绍 OllyDbg调试器
什么是OllyDbg?
OllyDbg简称OD,是一款具有可视化界面的用户模式调试器,结合了动 态调试和静态分析,具有强大的反汇编引擎,能够识别数千个被C和 Windows所使用的函数,并能将其参数注释出,能自动分析函数过程、 循环语句、代码中的字符串等。
显示被调试程序的反汇编代 码
上面是我的总结,大家可以大致的了解一下,有什么 不清楚的地方,可以过来跟我交流。共享的文件里面 还有教程,大家可以根据里面的教程,做更深入的学 习。还有很多汇编代码的含义没有介绍,共享文件里 面有完备的代码解释,可以好好看看,参考参考。
以上有不当之处,请大家给与批评指正, 谢谢大家!
22
注意:此时的领空是模块USER32,领空就是在
某一时刻,CPU的CS:EIP所指向代码的所有者
领空
接着,在USER32的领空中,在77D6B05E代码行按下F2, 下断点,然后按F9运行,然后键入下图所示:
点check,可以看到程序被OD截停在下断点的地方,如图所示: 接着,按Alt+F9,返回到用户代码,可以回到:
调试中我们经常要用到的快捷键有这些:
使用OllyDbg从零开始Cracking 第十九章-OllyDbg反调试之IsDebuggerPresent
![使用OllyDbg从零开始Cracking 第十九章-OllyDbg反调试之IsDebuggerPresent](https://img.taocdn.com/s3/m/c15c000c6edb6f1aff001f89.png)
第十九章-OllyDbg反调试之IsDebuggerPresent本章开始,我们将讨论反调试的相关话题,包括手工以及通过OD插件来绕过对应的反调试的技巧。
很多程序会检测自身是否正在被调试,如果检测到正在被调试的话,就会结束自身进程或者不按常规流程运行。
所以绕过程序对OD的检测是很有必要的。
本章就介绍使用API函数-IsDebuggerPresent检测OD,这也是最常用的检测调试器的方法。
这里,我们使用Crackme1.exe来讲解,用OD加载它。
我们记得我们的OD只安装了命令栏插件,并没有安装绕过IsDebuggerPresent检测的插件,那么是如何使用IsDebuggerPresent来检测OD的呢?如果我们按F9键让程序运行起来,我们会发现并没有弹出CrackMe窗口,程序直接终止了。
OD的左下方显示程序已经终止,所以,我们看不到窗口出现,嘿嘿。
该CrackMe可能使用的是最常见的API函数IsDebuggerPresent 来检测是否被调试的。
重启该CrackMe,通过单击鼠标右键选择Search for-Name(label) in current module查看API函数列表,看看是否使用了IsDebuggerPresent。
我们看看API函数列表使用了IsDebuggerPresent,嘿嘿。
我们对该函数设置一个断点,看看该CrackMe哪里使用了这个函数。
我们运行起来,马上就断在该函数的入口处了。
根据堆栈窗口中的信息来看,该API函数没有参数,它干的唯一的事情就是检测当前程序是否正在被调试,如果你对该函数还有什么疑问,可以查看MSDN。
这里解释了该函数的功能,我们来翻译一下。
IsDebuggerPresent表示在被调试器调试情况下,调用该函数会返回正在被调试。
并且该函数是被Kernel32.dll导出的,该函数没有参数,如果当前程序正在被调试的话,返回值为1,没有被调试的话,返回值为0。
OllyDebug工具的使用
![OllyDebug工具的使用](https://img.taocdn.com/s3/m/2c45c716ff00bed5b9f31daf.png)
OllyDebug工具的使用【摘要】OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。
同时还支持插件扩展功能,是目前最强大的调试工具。
【关键词】OLLYDBG 反汇编调试专用工具一、OllyDBG 的安装OllyDBG 2.01b版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行其中的OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可(如图1-1)。
在其文件夹中:Plugin目录为OllyDebug软件的插件的存放文档。
UDD 目录的作用是保存你调试的工作。
比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时 OllyDBG 就会把你所做的工作保存到这个 UDD 目录,以便你下次调试时可以继续以前的工作。
如果不设置这个 UDD 目录,OllyDBG 默认是在其安装目录下保存这些后缀名为 udd 的文件,时间长了就会显的很乱,所以还是建议专门设置一个目录来保存这些文件。
图1-1(注:对于初学者本软件不需用额外进行设置,全部使用默认设置即可。
)二、OllyDBG的操作界面OllyDBG的操作界面主要如图1-2所示。
1 23 4图1-2整个操作界面分成四大部分:1.反汇编窗口:显示被调试程序的反汇编代码,具体的有:地址:本条汇编代码的内存地址。
HEX 数据:Intel HEX文件是记录文本行的ASCII文本文件,由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输存储ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。
反汇编:由反汇编得到的代码。
注释2.寄存器窗口:显示当前所选线程的CPU 寄存器内容,可以实时查看所有寄存器的变化情况。
3.内存数据窗口:显示内存或文件的内容,并且可以用快捷键Ctrl+G方便的查看和修改内存中的任意位置的数据,就像是一个小型的“内存编辑器”。
[转]用ollydbg实现源码级调试[文字模式]
![[转]用ollydbg实现源码级调试[文字模式]](https://img.taocdn.com/s3/m/190c276a2a160b4e767f5acfa1c7aa00b52a9d2a.png)
[转]用ollydbg实现源码级调试[文字模式][转]用ollydbg实现源码级调试linhanshi2004-12-17, 17:41:15by +immlep+E-mail:immlep[at]126[dot]com原文出处:/User14/immlep/index.html在论坛上经常看到有些人在问怎么样用ollydbg实现源码级调试!以前我没常用ollydbg,所以自己也没有注意这些问题,现在用得比较惯,所以也就把它的各个功能看了,发现用ollydbg来调试有源代码的程序还挺好用的,至少我觉得比vc什么的自带的调试器好用多了!在此写出来和大家分享一下,其实这些都是很容易的,只不过之前没有多少人写出来,至于我自己写出来也只是起到一个抛砖引玉的作用而已!没有什么技术性可言!而且中间可能有多个错误,那么其中涉及到的一些问题就需要你自己去解决了,我也希望如果你发现什么比较好的技巧的话,可以告诉我一声!在本文中我测试的是用vc++以debug编译的程序(不能用Release方式编译,否则无法结合代码调试)!至于用其它编译器编译的软件我还没试过!你可以自己试一下!首先我们新建debug example.cpp,代码如下:以下内容为程序代码:#include "windows.h"void main(){MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);return;}用vc++以debug方式编译程序,这时在你的工程目录下会生成debug目录,现在你就可以用ollydbg来调试了(就怎么简单)!用ollydbg打开debug目录下的debug example.exe,这时你会发现,ollydbg显示的内容很详细!入口点处的部分代码:以下内容为程序代码:004010B0 >/ 55 PUSH EBP004010B1 |. 8BEC MOV EBP,ESP004010B3 |. 6A FF PUSH -1004010B5 |. 68 30F14100 PUSH debug_ex.0041F130004010BA |. 68 A42B4000 PUSH debug_ex._except_handler3 ; SE handler installation004010BF |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]004010C5 |. 50 PUSH EAX004010C6 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP004010CD |. 83C4 F0 ADD ESP,-10004010D0 |. 53 PUSH EBX004010D1 |. 56 PUSH ESI004010D2 |. 57 PUSH EDI004010D3 |. 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP004010D6 |. FF15 88414200 CALL NEAR DWORD PTR DS:[<&KERNEL32.GetVersion>] ; KERNEL32.GetVersion 004010DC |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 004010E1 |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 004010E6 |. C1E8 08 SHR EAX,8004010E9 |. 25 FF000000 AND EAX,0FF004010EE |. A3 EC254200 MOV DWORD PTR DS:[_winminor],EAX004010F3 |. 8B0D E0254200 MOV ECX,DWORD PTR DS:[_osver]004010F9 |. 81E1 FF000000 AND ECX,0FF004010FF |. 890D E8254200 MOV DWORD PTR DS:[_winmajor],ECX00401105 |. 8B15 E8254200 MOV EDX,DWORD PTR DS:[_winmajor]0040110B |. C1E2 08 SHL EDX,80040110E |. 0315 EC254200 ADD EDX,DWORD PTR DS:[_winminor]00401114 |. 8915 E4254200 MOV DWORD PTR DS:[_winver],EDX0040111A |. A1 E0254200 MOV EAX,DWORD PTR DS:[_osver] 0040111F |. C1E8 10 SHR EAX,1000401122 |. 25 FFFF0000 AND EAX,0FFFF00401127 |. A3 E0254200 MOV DWORD PTR DS:[_osver],EAX 0040112C |. 6A 00 PUSH 0 ; /Arg1 = 000000000040112E |. E8 8D180000 CALL debug_ex._heap_init ; \_heap_init00401133 |. 83C4 04 ADD ESP,400401136 |. 85C0 TEST EAX,EAX00401138 |. 75 0A JNZ SHORT debug_ex.004011440040113A |. 6A 1C PUSH 1C0040113C |. E8 CF000000 CALL debug_ex.0040121000401141 |. 83C4 04 ADD ESP,400401144 |> C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 0040114B |. E8 00150000 CALL debug_ex._ioinit现在我们就要进入重点了,在ollydbg中打开View-->Source files!这是你会发现这样的列表:Source filesModule Source Source pathdebug_ex (Absent) G:\crack\zz\Debug\sbheap.cdebug_ex (Absent) G:\crack\zz\Debug\dbgheap.cdebug_ex (Absent) G:\crack\zz\Debug\osfinfo.cdebug_ex (Absent) G:\crack\zz\Debug\mbctype.cdebug_ex (Absent) G:\crack\zz\Debug\a_map.cdebug_ex (Absent) G:\crack\zz\Debug\crt0msg.cdebug_ex (Absent) G:\crack\zz\Debug\_flsbuf.cdebug_ex (Absent) G:\crack\zz\Debug\dbgrpt.cdebug_ex (Absent) G:\crack\zz\Debug\winsig.cdebug_ex (Absent) G:\crack\zz\Debug\malloc.cdebug_ex (Absent) G:\crack\zz\Debug\wctomb.cdebug_ex (Absent) G:\crack\zz\Debug toa.cdebug_ex (Absent) G:\crack\zz\Debug\crt0dat.cdebug_ex (Absent) G:\crack\zz\Debug\lseek.cdebug_ex (Absent) G:\crack\zz\Debug\crtmbox.cdebug_ex (Absent) intel\ullrem.asmdebug_ex (Absent) G:\crack\zz\Debug\fclose.cdebug_ex (Absent) G:\crack\zz\Debug\vsprintf.cdebug_ex (Absent) G:\crack\zz\Debug\fflush.cdebug_ex (Absent) G:\crack\zz\Debug\_file.cdebug_ex (Absent) G:\crack\zz\Debug\isatty.cdebug_ex (Absent) G:\crack\zz\Debug\a_env.cdebug_ex (Absent) G:\crack\zz\Debug\heapchk.cdebug_ex (Absent) G:\crack\zz\Debug\dbghook.cdebug_ex (Absent) G:\crack\zz\Debug\write.cdebug_ex (Absent) G:\crack\zz\Debug\_getbuf.cdebug_ex DEBUG EXAMPLE.CPP G:\crack\zz\debug example.cppdebug_ex (Absent) G:\crack\zz\Debug\winxfltr.cdebug_ex (Absent) G:\crack\zz\Debug\stdargv.cdebug_ex (Absent) G:\crack\zz\Debug\output.cdebug_ex (Absent) intel\chkstk.asmdebug_ex (Absent) intel\memset.asmdebug_ex (Absent) G:\crack\zz\Debug\_freebuf.cdebug_ex (Absent) G:\crack\zz\Debug\crt0fp.cdebug_ex (Absent) G:\crack\zz\Debug\handler.cppdebug_ex (Absent) intel\strlen.asmdebug_ex (Absent) G:\crack\zz\Debug\a_str.cdebug_ex (Absent) G:\crack\zz\Debug\heapinit.cdebug_ex (Absent) G:\crack\zz\Debug\dosmap.cdebug_ex (Absent) intel\ulldiv.asmdebug_ex (Absent) G:\crack\zz\Debug\sprintf.cdebug_ex (Absent) G:\crack\zz\Debug\commit.cdebug_ex (Absent) Intel\MEMCPY.ASMdebug_ex (Absent) G:\crack\zz\Debug\close.cdebug_ex (Absent) G:\crack\zz\Debug\closeall.cdebug_ex (Absent) intel\memcpy.asmdebug_ex (Absent) G:\crack\zz\Debug\realloc.cdebug_ex (Absent) G:\crack\zz\Debug\ioinit.cdebug_ex (Absent) G:\crack\zz\Debug\expand.cdebug_ex (Absent) G:\crack\zz\Debug\free.cdebug_ex (Absent) G:\crack\zz\Debug\isctype.cdebug_ex (Absent) G:\crack\zz\Debug\crt0.cdebug_ex (Absent) intel\strcat.asmdebug_ex (Absent) G:\crack\zz\Debug\stdenvp.cdebug_ex (Absent) intel\strncpy.asm看到了DEBUG EXAMPLE.CPP没有?!双击它,怎么样,是不是看到了:在这里就可以查看代码了,而且还显示出了每行代码的行号!双击它就可以来到该代码对应的汇编代码处了,你也可以直接在源代码上下断点,到了这里是不是很熟悉了!我们这里先来试试!以下内容为程序代码:1.#include "windows.h"2.3.void main()4.{5.6. MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);//就用这一句开刀吧!7.8. return;9.}10.11.在第六行按F2下断点,双击来到了对应的汇编代码处:以下内容为程序代码:00401028 |. 8BF4 MOV ESI,ESP0040102A |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL0040102C |. 68 38F04100 PUSH debug_ex.0041F038 ; |Title = "Test"00401031 |. 68 5CFF4100 PUSH debug_ex.0041FF5C ; |Text = "debug example for cppwelcome to "00401036 |. 6A 00 PUSH 0 ; |hOwner = NULL00401038 |. FF15 8C424200 CALL NEAR DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA按F9执行一下看看!断在00401028处!在ollydbg里还可以看到:ESP=0012FF34ESI=00000000debug example.cpp:6. MessageBox(NULL,"debug example for cpp\nwelcome to ","Test",MB_OK);怎么样,哪个文件,哪一行代码,连代码是什么都显示出来了!爽不爽!间不简单!?当然用ollydbg调试不仅仅只有上面所说的功能,它还有其它的功能,这个你自己去看看就可以去了解!WiNrOOt2004-12-17, 18:32:30个人觉得:对于3环的源码级调试最好的工具就是IDE集成的调试器那才叫真正的源码级调试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二十九章-P-CODE-Part1(本章的CrackMe需要支持库MSVBVM50.DLL)前面章节我们已经介绍了Visual Basic破解相关的基础知识,如果大家还想更加深入的研究VB应用程序破解的话,可以继续学习高级篇中的关于VB破解的相关内容。
(PS:就是我打包上传到百度网盘的西班牙破解文集系列)COCO写的VB破解教程就比较好,其中可能会涉及到比较复杂的处理技巧,拿来练习做好不过了。
还有一些其他优秀教程可供我们更加深入的研究VB Cracking。
接着下来我们将讨论下一个话题-P-CODE。
我们知道VB编写的应用程序有两种编译方式:一种是Native方式,我们前面章节已经讨论过了,两一种就是P-CODE方式-我们接下来将讨论的话题。
Native编译的代码和P-CODE的主要区别在于:Native是直接执行代码段中的代码的。
而对于P-CODE,如果我们使用之前那个Patch过的OD加载它,并且给代码段设置内存访问断点的话(实际上是内存执行断点),除非是直接调用API函数,否则不会断下来。
说明,该区段没有直接可供CPU执行的代码。
P-code,实际上是一组自定义的指令集,必须通过基于堆栈的虚拟机翻译为80X86上的指令集才能执行,即通过msvbvm50.dll和msvbvm60.dll这两个动态库来解释执行。
也可以理解为通过P-CODE告诉虚拟机将要进行什么操作。
例如:1e 表示执行无条件跳转(JMP)1e意味着执行无条件跳转,该无条件跳转是通过虚拟机(msvbvm50.dll,msvbvm60.dll)来执行的,也就是说P-CODE程序会读取代码段中的值,然后由这些值来告诉虚拟机需要执行什么操作。
这也就是为什么我们说P-CODE程序的代码段中没有可执行代码的缘故。
现在就让我们一起拿起“手术刀”来跟踪,剖析一个CrackMe的P-CODE的奥秘吧。
我们实验的这个CrackMe名字叫做clave1,这个CrackMe是我朋友JB DUC写的,用来介绍P-CODE相关的内容正好合适,我们需要找到该CrackMe的正确序列号。
很多人调试P-CODE可能喜欢用WKT,如果大家想了解WKT怎么调试P-CODE的话,可以看JB DUC关于P-CODE的破解教程,我们这里还是用OllyDbg来调试了,由于微软官方并没有提供操作码的清单,所以还会用到另外一个工具EXDEC-这个工具可以识别操作码的名称。
我们使用原版的OD,配置好反反调试插件,加载该CrackMe。
可以看到停在了入口点处。
说明一点,之前介绍的用于剔除Native程序的NAG窗口的4C法同样适用于P-CODE。
现在我们来看看跟Native的不同的地方:我们从入口点往下看,会发现没有几行代码。
我们只看到了大片的字节码,这里不要试图去分析这些字节码(毫无意义),我们应该还记得对于Native方式编译的VB应用程序,入口点往下还会有大量的代码吧。
也有相似的字节码,我们继续往下。
这里我们可以看到大段的代码,而P-CODE的程序的话OllyDbg可能也会显示处少量的代码,OD识别成了指令,但其实这些地方也是纯字节码。
我们继续来看刚刚那个P-CODE的CrackMe。
另外一个特征就是MethCallEngine这个API函数,该函数我们在P-CODE方式编译的VB应用程序中都能看到,所以我们甄别一个VB应用程序是不是以P-CODE方式编译的,一般有两步:1:看代码段中入口点以下是不是大片的字节码2:看有没有MethCallEngine这个函数。
好了,现在我们来看看字符串列表中有没有什么有价值的字符串。
貌似没看到什么有用的字符串。
好,那我们直接给JMP MethCallEngine这一行下一个断点吧。
接下来我们选中JMP MethCallEngine这一行,单击鼠标右键选择-Follow,转入MethCallEngine内部,接着在MethCallEngine入口点处设置一个断点。
运行起来。
弹出了注册窗口,等待我们输入序列号。
对于Native的VB程序,我们可以断API函数,但是P-CODE就搞不定了,但4C法对P-CODE 程序依然有用。
现在我们随便输入一个错误的序列号。
我们单击Registrar(西班牙语:注册)按钮。
断在了JMP MethCallEngine处,MethCallEngine函数对P-CODE进行初始化。
我们继续运行,断在了MethCallEngine的入口处,我们来看看它做了些什么。
我们可以看到跳转到了7413D243处。
现在我们用ExDec打开该CrackMe。
ExDec是一款专门针对P-CODE的反编译器。
我们来看看它显示了些什么。
我们可以看到将被读取的第一个字节是04,位于401BD0地址处,应该在第一次读取代码段指令的附近,我们可以给该字节设置一个内存访问断点。
我们单击Registrar按钮后就会断在了MethCallEngine处,我们给代码段设置内存访问断点。
运行起来的话,将断在了读取代码段的指令处,读取401BD0内存单元中04的指令应该就在附近,所以我们接着给该字节设置内存访问断点,继续运行,就能马上定位到。
我们按F9运行起来。
断了下来,这个时候我们给刚刚那个04字节设置内存访问断点,运行起来,又断了下来,我们可以看到ESI指向的就是401BD0内存单元。
(PS:这里下断点的顺序我换了次序,一次就可以定位到,作者10次才定位到)这里读取[ESI]的04字节值保存到AL中,这里是读取到的第一个P-CODE操作码。
接着我们来看看ExDec中显示的其他操作码。
我们将ExDec跟OD的数据窗口显示的内容对应起来看,会发现这些操作码并不连续,这是因为中间夹杂着操作码需要的参数。
正如你所看到的,这里正在读取第一个字节。
我们可以看到当前ESI指向了401BD0,下一行,ESI值递增1,以便读取操作码的参数。
接着我们就到了间接跳转JMP指令这里,这一行将去执行这个操作码(我们在ExDec中看到的04)。
我们可以看到一个陌生的操作码。
这里我们可以看到将执行操作码04(即FLdRfVar),就只有几行代码,也没实现什么很神奇的操作,嘿嘿。
还可以看到XOR EAX,EAX,然后就是读取后面操作码。
这里首先读取紧跟在04后面两个字节的参数。
通过MOVSX指令将FF74(这是个负数,前面汇编章节介绍过)保存到EAX中,我们继续跟踪。
EAX的值为-8C(十六进制),我们双击EAX值的话可以看到:我们可以看到FF74对应的十进制是-140也就是十六进制的-8C。
我们可以看到ExDec中显示的是8C。
接下来一行,操作码的参数值被加上EBP寄存器的值。
接下来一行使用PUSH指令将刚刚运算的结果压入堆栈。
这里相当于PUSH EBP - 8C (EBP - 8C:标识着堆栈中的局部变量),我的机器上,EBP的值为12F4E0,减去8C就得到了12F454。
即当前EAX中的值。
也就是使用PUSH指令压入堆栈中的值。
好,我们继续往下跟。
我们可以看到通过XOR EAX,EAX指令将EAX清零了,这就意味着操作码被清零了,该操作完成了,重置寄存器的值,然后接下来一行就可以读取下一个操作码了。
第二个操作码是21,在接下来的一行读取它。
操作码跟之前一样依然被是保存在AL。
现在ESI被加上3,指向当前操作码的参数,接着通过间接跳转JMP去执行操作码21。
我们来Google一下它的含义。
好,这里我们可以看到有些前辈做了注释,虽然我们不知道它具体是干什么用的,但是根据字面的意思来理解就是加载一个指针,并且指向一个数据项。
我们继续往下跟。
这里是将EBP + 8指向内存单元的内容读取出来并保存到EBP - 4C指向的内存单元中。
这个值在我的机器上是15B000,我们在数据窗口中定位到这个地址。
该地址中保存的是4022E8,我们继续在数据窗口中定位到4022E8。
这里我们可以推断出15B000其实是一个指针。
该指针指向了一张表,虽然对我们的破解起不到什么实质性的帮助,但起码我们还是看出一点门道了。
还有一点就是可以看出该操作码没有参数。
我们继续跟。
这里EAX又被清零了,下一行读取第三个操作码。
从ExDec中我们可以看出该操作码是0F。
VcallAd以上是0F这个操作码具体的解释,我们可以看到它有一个占两个字节的参数。
该参数我这里显示的0300,其表示句柄表中数据元素的偏移。
接下来是一个间接跳转JMP,我们跟进去看看。
又是读取EBP - 4C的内容,保存到EBX中。
这里我们可以看到是15B000,并使用PUSH指令压入到堆栈中。
接着是将参数值300保存到EAX中。
这里EBX的值为15B000(我们已经知道了它指向了一张表),该表起始地址为4022E8,我们姑且将这张表称之为Description Item Table。
这里由该表的起始地址偏移300。
表的起始地址偏移300就得到了4025E8,保存到EAX中。
该值指向了表的这里。
这里操作码0F就是根据参数值指明的偏移量来定位前一个操作码获取到的表中的数值。
这里是使用CALL指令间接调用EAX内存单元中保存的值处。
该值为7414C348,这里我们不跟进去,结果会被保存在堆栈中的。
我们直接按F8键单步步过这个CALL。
我们可以看到堆栈中保存了结果,我们需要弄明白它表示什么意思。
接下来的操作码是19,参数值是88,代表一个局部变量。
这里我们直接跟进。
我们看到这里。
通过MOVSX指令读取出占两个字节的参数值,将其保存到EAX中。
FF开头表明该参数值是一个负数。
该值对应的十六进制为-88,跟ExDec中显示的刚好对应起来了。
十进制的-139正好等于十六进制的-88。
接着ESI 加2,然后刚刚计算出的-88加上EBP的值,即将EBP - 88保存到EAX中。
这里我们可以看到到达了一个CALL处,根据堆栈的来看其有三个参数。
第一个参数是前一个操作码执行的结果,第二个参数我这里是12F458,即EBP - 88-表示一个局部变量。
第三个参数是-1。
这里我们不跟进这个CALL,直接按F8键单步步过这个CALL,看看会发生什么。
我们会发现堆栈发生了变化,ECX被清零了。
EBP-88内存单元保存了前一个操作码执行的结果。
接下来一个操作码是08,它也将局部变量EBP - 88作为参数。
我们跟进这个JMP。
这下面并不是我们之前看到的XOR EAX,EAX结束,而是OR EAX,EAX,接着使用条件跳转判断EAX是否为零。
我们来看看它具体干了些什么。
首先将操作码的参数FF78保存到EAX中,注意这里使用的是MOVSX,FF开头表示是负数,十六进制值为-88。
这一行是将EAX + EBP指向内存单元的值保存到EAX中,即EBP - 88这个局部变量的值。