使用OllyDbg从零开始Cracking 第三十二章-OEP寻踪
- 格式:doc
- 大小:662.05 KB
- 文档页数:18
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 位汇编—分析调试器。
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的使⽤(下)⼀、简介此次教程我们继续学习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版本修改了⼀些内容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 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标或显示标题 来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。
启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的 选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个 UDD 目录不清楚。
OllyDBG⼊门系列(三)-函数参考现在进⼊第三篇,这⼀篇我们重点讲解怎样使⽤ OllyDBG 中的函数参考(即名称参考)功能。
仍然选择 镜像打包中的⼀个名称为 CrackHead 的crackme。
⽼规矩,先运⾏⼀下这个程序看看:呵,竟然没找到输⼊注册码的地⽅!别急,我们点⼀下程序上的那个菜单“Shit”(真是 Shit 啊,呵呵),在下拉菜单中选“Try It”,会来到如下界⾯:我们点⼀下那个“Check It”按钮试⼀下,哦,竟然没反应!我再输个“78787878”试试,还是没反应。
再试试输⼊字母或其它字符,输不进去。
由此判断注册码应该都是数字,只有输⼊正确的注册码才有动静。
⽤ PEiD 检测⼀下,结果为 MASM32 / TASM32,怪不得程序⽐较⼩。
信息收集的差不多了,现在关掉这个程序,我们⽤ OllyDBG 载⼊,按 F9 键直接让它运⾏起来,依次点击上⾯图中所说的菜单,使被调试程序显⽰如上⾯的第⼆个图。
先不要点那个“Check It”按钮,保留上图的状态。
现在我们没有什么字串好参考了,我们就在API 函数上下断点,来让被调试程序中断在我们希望的地⽅。
我们在 OllyDBG 的反汇编窗⼝中右击⿏标,在弹出菜单中选择 查找->当前模块中的名称 (标签),或者我们通过按 CTR+N 组合键也可以达到同样的效果(注意在进⾏此操作时要在 OllyDBG 中保证是在当前被调试程序的领空,我在第⼀篇中已经介绍了领空的概念,如我这⾥调试这个程序时 OllyDBG 的标题栏显⽰的就是“[CPU - 主线程, 模块 -CrackHea]”,这表明我们当前在被调试程序的领空)。
通过上⾯的操作后会弹出⼀个对话框,如图:对于这样的编辑框中输注册码的程序我们要设断点⾸选的 API 函数就是 GetDlgItemText 及 GetWindowText。
每个函数都有两个版本,⼀个是 ASCII 版,在函数后添加⼀个 A 表⽰,如 GetDlgItemTextA,另⼀个是 UNICODE 版,在函数后添加⼀个 W 表⽰。
第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破解⼊门教程图⽂⼀、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,我们再到界⾯选项中看⼀下,会发现我们原先设置好的路径都已保存了。
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入门教程OllyDBG 入门系列(一),认识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(OD)分析⼀个简单的软件作者:Crazyman_Army原⽂来⾃:0x00知识回顾 (由于笔者省事,没开XP虚拟机,⽽且没关闭ASLR,所以每次重载的内存地址会不⼀样)在第⼀章的内容中,笔者已经讲了OllyDbg(简称OD)的界⾯介绍以及基础的操作,普及了常⽤的汇编指令上次课在底下的附件中,我留下了⼀个演⽰样例,⼤家载⼊OD后搜索到字符串点击跟踪到反汇编窗⼝的时候会发现与第⼀章所讲的程序的框架不太⼀样.尤其可见多出了很多的call指令,call指令在汇编中就是调⽤⼦程序,下⾯放出代码,各位同学可以⽐对⼀下与上篇⽂件所贴出代码的不同代码如下:#include <windows.h>#include <tlhelp32.h>#include <stdio.h>BOOL getProcess(const char *procressName);BOOL getProcess(const char *procressName){char pName[MAX_PATH];strcpy(pName, procressName);CharLowerBuff(pName, MAX_PATH);PROCESSENTRY32 currentProcess;currentProcess.dwSize = sizeof(currentProcess);HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcess == INVALID_HANDLE_VALUE){printf("CreateToolhelp32Snapshot()调⽤失败!\n");return FALSE;}_asm NOP;BOOL bMore = Process32First(hProcess, ¤tProcess);while (bMore){CharLowerBuff(currentProcess.szExeFile, MAX_PATH);if (strcmp(currentProcess.szExeFile, pName) == 0){CloseHandle(hProcess);return TRUE;}bMore = Process32Next(hProcess, ¤tProcess);}CloseHandle(hProcess);return FALSE;}int main(){char* process = "explorer.exe";if (getProcess(process)){printf("发现explorer.exe\n");system("pause");exit(0);}else{printf("没有发现explorer.exe\n");printf("Cracke Success!");}getchar();return 0;}从代码⾓度来看,很明显,这次笔者讲判断进程封装成⼀个返回布尔值的函数,所以才会在核⼼判断部分出现如此多的调⽤,那这当然不能像上次⼀样改⼀步简单的跳转就解决问题,如果改得不对就会造成程序的崩溃。
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方便的查看和修改内存中的任意位置的数据,就像是一个小型的“内存编辑器”。
Ollydbgx32dbgx64dbg贴⼼伴侣Version6.48使⽤详解Ollydbg/x32dbg/x64dbg贴⼼伴侣 Version 6.48使⽤详解和开发历程:2020.7.24号是个不幸的⽇⼦,我⼈⽣当中第⼀次体验到了⼼碎的感觉。
这天晚上,我正在继续忙着整理汇编破解总结资料时,我的⼀块希捷硬盘(2000G)突然间硬盘分区不显⽰了(实际上是两个分区)⾥边有⼤量⾃制的软件,破解资料总结,破解流程图,⼤⽩使⽤视频总结与思维导图,各种⽹上优秀的共享软件,各种视频学习笔记总结资料等。
有太多太多的回忆的东西和情感在⾥边,⼀下⼦全都没有了,那种撕⼼裂肺,那种希望⼀下⼦被磨灭了。
我⾟苦汉化的IDE for python也有其中,⽽我⾃编的《信⼿拈来按键帮你来》Delphi源码也在虚拟机⽂件中。
还好我最近⾃编的《Ollydbg/x32dbg/x64dbg贴⼼伴侣》不在其中,费了好⼤劲汉化的RegexBuddy不在⾥边。
DDMS汉化也没有了,⾟苦汉化的wind ide for python也没有了,开发了两年多的《信⼿拈来按键帮你来AHK》也没有了(⽽且程序的源码在VMDK虚拟机⾥。
还有太多太多的东西也没能幸免。
在⽹上创业是⾮常不容易的,尤其在中国。
我也在想,这些年都⼲了什么?对得起逝去的时间么?为什么没给硬盘多⼀份备份?为什么这东西突然就挂了?好容易最近编的软件,做的视频取得了⼀些⼩收⼊。
⼜有不幸传来,真是欲哭⽆泪啊。
所以眼下最重要的是把⼿⾥的这个《Ollydbg/x32dbg/x64dbg贴⼼伴侣》卖出去,好买块⼤硬盘(没有⼤硬盘的⽇⼦是极其悲催的,没有更多的地⽅下载,安装⼀个Delphi10.3原来的两块硬盘剩余空间就没有多少了)接下来还要攒⾜很多钱去维修这块硬盘。
因为这⾥边有很多有意义,费了⼤劲整理出来的资料。
《Ollydbg/x32dbg/x64dbg贴⼼伴侣》是⼀款汇编破解辅助⼯具,易在让逆向过程变得轻松简单,让x32dbg中⼤量的命令⾏变得简单化操作;同时也是部海量整理的汇编总结数据库。
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根本不需要安装,可直接在软盘中运行!调试DLLs:您可以利用OllyDbg调试标准动态链接库 (DLLs)。
第三十二章-OEP寻踪在上一章中我们提到了OEP(Original EntryPoint)的概念,也就是应用程序原本要执行的第一行代码,OEP %99的情况位于第一个区段中(本章中有一个例子,OEP就不在第一个区段,我是特意举的这个例子,嘿嘿)。
我们知道当到达OEP后,各个区段在内存中的分布跟原始程序很接近,这个时候我们就可以尝试将其转储到(dump)文件中,完成程序的重建工作(PS:脱壳)。
通常脱壳的基本步骤如下:1:寻找OEP2:转储(PS:传说中的dump)3:修复IAT(修复导入表)4:检查目标程序是否存在AntiDump等阻止程序被转储的保护措施,并尝试修复这些问题。
以上是脱壳的经典步骤,可能具体到不同的壳的话会有细微的差别。
本章我们主要介绍定位OEP的方法。
很多时候我们遇到的壳会想方设法的隐藏原程序的OEP,要定位OEP的话就需要我们尝试各种各样的方法了。
首先我们来看看上一章CRACKME UPX,然后再来看其他的壳。
1)搜索JMP或者CALL指令的机器码(即一步直达法,只适用于少数壳,包括UPX,ASPACK壳)对于一些简单的壳可以用这种方式来定位OEP,但是对于像AsProtect这类强壳(PS:AsProtect在04年算是强壳了,嘿嘿)就不适用了,我们可以直接搜索长跳转JMP(0E9)或者CALL(0E8)这类长转移的机器码,一般情况下(理想情况)壳在解密完原程序各个区段以后,需要一个长JMP或者CALL跳转到原程序代码段中的OEP处开始执行原程序代码。
下面我们将上一章中加了UPX壳的那个CrueHead的CrackMe加载到OD中:这里我们按CTRL+B组合键搜索一下JMP的机器码E9,看看有没有这样一个JMP跳转到原程序的代码段。
多按几次CTRL+L。
搜索到了几处,但都不是跳往第一个区段的,直到定位到如下位置:这个JMP是跳转到第一个区段的,我们在这条指令处设置一个断点,断在这里时,我们按F7键就可以单步跳转到OEP处。
除了搜索JMP指令的机器码以外,大家还可以尝试搜索CALL EAX,CALL EBX,JMP EAX等指令的机器码,因为很多壳是将OEP 的值存放在寄存器中,然后通过CALL 某寄存器或者JMP 某寄存器来跳往OEP的。
OllyBbg提供了搜索ALL COMMANDS的功能,我们可以通过单击鼠标右键选择-Search for-All Commands来搜索,然后各个指令处依次设置断点,下面我们来看个例子。
这里没有搜到任何记录,但是如果存在这样的指令的话,那么会在一个列表里面全部显示出来,我们就可以依次在每条记录上单击鼠标右键选择设置断点,当断下来的时候,我们可以看EAX的值为多少,根据EAX的值来确实是不是CALL或者JMP转移到第一个区段中。
这种搜索机器码的方式大家不是很常用,因为现在大部分的壳的解密例程都具有自修改功能,特别对于跳转到OEP这样的指令通常都是做了隐藏处理的,就是为了防止Cracker搜索机器码,但是,该方法对于一些简单的壳还是挺管用的。
2)使用OllyDbg自带的功能定位OEP(SFX法)演示这种方法目标程序我们还是选择CRACKME UPX.EXE,用OD加载该程序,然后选择菜单项Options-Debugging options-SFX。
上图中SFX选项中用箭头标注出来的两个选项就是OllyDbg用来辅助定位OEP的,红色箭头标注的选项定位速度快,绿色箭头标注的选项定位速度慢,但是定位更加精确一些(PS:因为是按字节来定位的),我们来实验一下,选择红色箭头的选项。
重新加载该程序,会发现该选项并没有起作用,是因为如下原因:我们可以看到OllyDbg帮助文档中的解释是,该选项只有当OllyDbg发现入口点位于代码段之外的时候才会起作用,而当前这个程序的入口点恰恰是位于代码段中的,所以OllyDbg的该选项就不起作用了。
壳的入口点位于代码段中的情况还是比较少见的。
为了演示如何该选项在什么情况下能够起作用,这里给大家提供了一个名为UnPackMe_ASPack2.12的小程序,从名称上来看大家就应该可以猜到使用了ASPack壳。
首先我们使用Options-Debugging options-SFX中默认的选项,看看OllyDbg会不会检测到入口点位于代码段之外。
我们可以看到OllyBbg弹出了一个消息框显示入口点位于代码段之外。
我们单击Aceptar(确定)按钮。
到了壳的入口点处。
现在我们勾选上红色箭头标注的选项,并确保EXCEPTIONS菜单项中的忽略异常的选项都被勾选上了,重启OD。
运行起来。
我们可以看到停在了404000处,OllyDbg显示《Real entry point of SFX code》,即”真正的自解压代码的入口点”。
(该程序是一个特例,OEP并不位于第一个区段,是位于第三个区段)这里我们可以看到该选项起作用了,定位到了OEP,现在我们再来试试绿色箭头标注的选项,OllyDbg显示该选项定位OEP会很慢。
我们重启OllyDbg发现不一会儿就又停在了OEP处(PS:不是说很慢吗?),这是因为壳的解密例程太简短了,如果壳的解密例程很长的话,这两个选项的速度对比就能体现出来了。
这里大家要注意,在使用完该选项以后要记得恢复其默认的选项,如果不恢复默认选项的话,OD在分析其他正常的程序的时候就不会停在正常的入口点处了,进而影响程序的分析工作。
3)使用Patch过的OD来定位OEP(即内存映像法)就是我们在VB章节中使用的那个Patch过的OD,即正常的内存访问断点读取,写入,执行的时候都会断下来,该Patch过的OD 内存访问断点仅当执行的时候才会断下来,我们可以利用这一点来定位OEP,我们还是来看看CRACKME UPX,首先来看看区段列表。
UPX壳的解密例程会解密原程序的各个区段并将各个区段原始字节写回到原处,我们最好不要在解密区段的过程中断下来,说不定要断成千上万次才能到达OEP,这里有了这个Patch过的OD就方便多了,其内存访问断点仅当执行的时候才会断下来,当其在执行第一个区段中的代码时,基本上就可以断定是OEP了。
同样这里也要勾选上了忽略各种异常的选项,运行起来。
这种方法可能有点慢,因为设置的是内存访问断点(PS:写过调试器的童鞋应该知道,内存断点的机制决定了其慢的特性)。
这里定位OEP的过程快则几秒钟,慢则几分钟不等(PS:大家可以去泡杯咖啡慢慢等,嘿嘿)。
不一会儿我们会发现定位到了OEP。
接着我们再来看看UnPackMe_ASPack2.12。
运行起来。
我们可以看到执行的第一行是这里,我们按下F7键看看会发生什么。
我们可以看到还是返回到了壳的解密例程中了,我们再次运行起来,程序直接运行起来了,为什么会这样呢?因为这里壳的解密例程并不是将原程序代码段解密到第一个区段中,所以我们可以继续给后面的区段设置内存访问断点,逐一排查。
我们再来解释一下整个流程,直接运行该CrackMe的效果如下:如果弹出了这个窗口就表示该程序在内存中解密区段完毕了,原程序的代码得以执行,我们依次给各个区段设置内存访问断点,然后运行起来,如果程序直接运行起来了,就证明这个区段不是我们要定位的,继续给下一个区段设置内存访问断点。
这里由于给第一个区段设置内存访问断点断了下来,但是继续执行程序就运行起来了,所以我们继续给第二个区段设置内存访问断点,当我们给第三个区段设置内存访问断点的时候其断在了404000地址处。
这里我们可以看到断在了OEP处,如果大家还不放心的话,继续运行,会发现继续断在下一条指令处,可以进一步断定这里是OEP 了。
这种方法对很多壳都有效,嘿嘿。
4)堆栈平衡法(即ESP定律法)这种方法适用于一些古老的壳。
这些壳首先会使用PUSHAD指令保存寄存器环境,在解密各个区段完毕,跳往OEP之前,会使用POPAD指令恢复寄存器环境。
这里我们来看看CRACKME UPX。
我们可以看到第一条指令就是PUAHAD,有的情况下保存寄存器环境可能不是第一条指令,但也在附近了,还有些情况下,有些壳不使用PUSHAD,而是逐一PUSH各个寄存器(例如:PUSH EAX,PUSH EBX等等),总而言之,在解密完区段,跳往OEP之前会恢复寄存器环境。
这里我们按F7键执行PUSHAD:可以看到各个寄存器的初始值被压入到堆栈中了,这里我们可以对这些初始值设置内存或者硬件访问断点,当解密例程读取这些初始值的时候就会断下来,断下来处基本上就在OEP附近了。
这里我们可以通过在ESP寄存器值上面单击鼠标右键选择-Follow in dump在数据窗口中定位到这些寄存器的初始值。
数据窗口中显示的堆栈内容如下:这里我们可以对这些初始值的第一个字节或者前4个字节设置硬件访问断点。
选择字节,字,双字都可以,只要解密例程在读取这些值的时候断下来就OK,运行起来。
我们可以断在了POPAD指令的下一行,当壳的解密例程读取该值的时候断了下来,紧接着下面就是跳往OEP处,说明这个方法起作用了。
我们再来看看UnPackMe_ASPack2.12。
我们可以看到第一行也是PUSHAD,我们依然按F7键执行PUSHAD,然后还是通过在ESP寄存器值上面单击鼠标右键选择-Follow in dump在数据窗口中定位到这些寄存器的初始值。
运行起来。
我们可以看到断在了跳往OEP PUSH 404000指令之前,我们继续按F7键单步。
可以看到到了OEP处。
这里要给大家说明一点,现在很多壳都能检测这种方法,所以说大家可以多多汲取一些方法和经验,尝试不同的方法,才能知道那种方法最合适。
我们继续来看其他定位OEP的方法。
5)VB应用程序定位OEP法(Native 或者P-CODE)定位VB程序的OEP比较容易,因为VB应用程序都有一个特点-开始都是一个PUSH指令,紧接着一个CALL指令调用一个VB API函数。
我们可以使用Patch过的OD,首先定位到VB的动态库,接着给该动态库的代码段设置内存访问断点,当壳的解密例程解密完原程序各个区段,接着就会断在VB DLL的第一条指令处,接着我们可以在堆栈中定位到返回地址,就可以来到OEP的下一条指令处。
这里我们也可以使用前面介绍的方法-跟逐一给各个区段设置内存访问断点(使用Patch过的OD),但是很多壳会检测这种方法,所以大家可能根据需要不同的情况来尝试这不同的方法。
这种方法很容易理解,我就不举例子了,以后大家如果遇到了VB程序可以试试这种方法。
6)最后一次异常法如果我们在脱壳的过程中发现目标程序产生大量异常的话,就可以使用最后一次异常法,我们来看一个例子,名字叫做”bitarts_evaluations.c”。