使用OllyDbg从零开始Cracking 第三十二章-OEP寻踪

合集下载

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程
运行OllyDbg后,打开选项/调试设置
程序运行之后,在系统 空间里会触发一个INT3
文件入口点
程序的Winmain()函数入口点, 但一般都是在文件入口点
设置完成之后,载入文件,出现如图所示:
虚拟地址
机器码:
CPU执行的机器 代码
汇编指令: 和机器码对应的
程序代码
3、单步跟踪
调试器一个最基本功能就是动态跟踪,OllyDbg单步跟踪功能键:
目的:可以让软件运行的时候停在设断点的地方,以方便 反复跟踪调试
当关闭程序时,OllyDbg会将设置好的断点保存在UDD文件 中,下次运行时还有效。
5、调试分析:
调试分析其实就是分析程序代码的意义,如图:
阅读这些代码时,首先要搞清楚各API函数的定义,还弄明白 那些汇编程序代码的具体含义
6、保存修改后的文件
这里又回到traceme的领空了我们可以按altb调出断点窗口然后将getdlgitemtexta的断点改为已禁止202137chenli18接下来就在004011ae下一个断点因为这里有调用到getdlgitemtexta这个函数然后就要开始分析这些汇编代码的意义所以我们在使用这个软件的时候一定要明白这些代码的含义现在我们只是先认识一下这个软件的作用所以就不为大家做出分析接下来就是修改代码了
注意:此时的领空是模块USER32,领空就是在
某一时刻,CPU的CS:EIP所指向代码的所有者
领空
接着,在USER32的领空中,在77D6B05E代码行按下F2, 下断点,然后按F9运行,然后键入下图所示:
点check,可以看到程序被OD截停在下断点的地方,如图所示: 接着,按Alt+F9,返回到用户代码,可以回到:
图中红色的就是我们修改的地方,然后就点右键,复制到 文件,就可以保存当前的修改

OllyDbg入门完全教程(完美排版)

OllyDbg入门完全教程(完美排版)

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)入门系列
00440F6B |. E8 F8C0FFFF CALL CrackMe3.0043D068
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完美教程

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的使用教程

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的基本使用

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使用方法和技巧
器尝试确认调用过程进栈的双字数目,并标记他们为参数Arg1,Arg2等等。注意:
如果有寄存器参数,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中相应的选项。

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,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个 UDD 目录不清楚。

OllyDBG入门系列(三)-函数参考

OllyDBG入门系列(三)-函数参考

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 表⽰。

使用OllyDbg从零开始Cracking

使用OllyDbg从零开始Cracking

第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破解⼊门教程图⽂⼀、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完全教程(一)一、什么是 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一、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)分析一个简单的软件

从零开始的程序逆向之路基础篇第二章——用OllyDbg(OD)分析一个简单的软件

从零开始的程序逆向之路基础篇第⼆章——⽤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工具的使用

OllyDebug工具的使用

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使用详解

Ollydbgx32dbgx64dbg贴心伴侣Version6.48使用详解

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完全教程(一)一,什么是 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

菜鸟脱壳之脱壳的基础知识:如何寻找OEP本文摘要这节我们来讲讲如何寻找一个程序的OEP,即Original Entry Point。

一些PE加壳程序在被加密的程序上面加了一个区段(有的壳也会合并区段),当外壳代码执行完毕以后,会跳到程序的本身的代码来执行,所以我们可以依靠跨区段的转移指令来寻找程序的入口点。

这节我们来讲讲如何寻找一个程序的OEP,即Original Entry Point。

一些PE加壳程序在被加密的程序上面加了一个区段(有的壳也会合并区段),当外壳代码执行完毕以后,会跳到程序的本身的代码来执行,所以我们可以依靠跨区段的转移指令来寻找程序的入口点。

我们来看看加壳之前的Delphi7.0的程序,用LordPE来打开Delphi7.0程序,我们看到程序的入口点是004C498:看区段,没有任何的新加的区块:我们来看看加了壳的程序的入口点,加过壳的入口点为000629D0:区段变为三个了,很明显,壳将原程序的区段给合并了:加了壳后,首先,各个区段都要被系统映射到内存中,因为现在的入口点是000629D0,是指向外壳部分的,外壳拿到了控制权以后,通过LoadLibrary、GetProcaddresss、GetModuleHandle等函数来获得自身所需要的API的地址,来解密各个区段的信息,填充好IAT后,就要跳到程序的OEP了(Entry Point),此例是004C498,我们用Ollydbg载入,设置好各个选项(我是把暂停点停在了WinMain处了)。

Ollydbg暂停以后,加壳程序停在了004629D0处:004629D0 > 60 pushad //保存现场(pushad 相当于push 所有的寄存器)004629D1 BE 00F04300 mov esi, 0043F000 //把代码段放到esi寄存器004629D6 8DBE 0020FCFF lea edi, dword ptr [esi+FFFC2000] //得到基址004629DC C787 9CC00400 7>mov dword ptr [edi+4C09C], 46CD167B//将第一个函数的地址放到[edi+ 4C09C]004629E6 57 push edi //将基址压栈004629E7 83CD FF or ebp, FFFFFFFF //将0012FFC0与FFFFFFFF或004629EA EB 0E jmp short 004629FA004629EC 90 nop004629ED 90 nop004629EE 90 nop004629EF 90 nop004629F0 8A06 mov al, byte ptr [esi] //取出0043F004的一个字节004629F2 46 inc esi //指向下一个字节004629F3 8807 mov byte ptr [edi], al //从00401000开始,开始还原代码004629F5 47 inc edi //指向下一个地址004629F6 01DB add ebx, ebx //ebx + ebx,当ebx不等于零的时候跳转,下面的adc 如果为,就取出下一个地址,并放到ebx中004629F8 75 07 jnz short 00462A01004629FA 8B1E mov ebx, dword ptr [esi] //将0043F000放到ebx中004629FC 83EE FC sub esi, -4 //0043F000加4004629FF 11DB adc ebx, ebx //进位加法器00462A01 ^ 72 ED jb short 004629F0 // 向上跳转,ebx做为是否回跳的标志,循环处理代码00462A03 B8 01000000 mov eax, 1 // eax = 100462A08 01DB add ebx, ebx // ebx依然作为循环的标志00462A0A 75 07 jnz short 00462A1300462A0C 8B1E mov ebx, dword ptr [esi] //esi指向的地址放到ebx里面00462A0E 83EE FC sub esi, -4 //esi + 4 00462A11 11DB adc ebx, ebx//进位加法00462A13 11C0 adc eax, eax //进位加法00462A15 01DB add ebx, ebx //ebx + ebx 00462A17 73 0B jnb short 00462A2400462A19 75 28 jnz short 00462A43 //跳到下面00462A1B 8B1E mov ebx, dword ptr [esi] 00462A1D 83EE FC sub esi, -400462A20 11DB adc ebx, ebx00462A22 72 1F jb short 00462A4300462A24 48 dec eax00462A25 01DB add ebx, ebx00462A27 75 07 jnz short 00462A3000462A29 8B1E mov ebx, dword ptr [esi] 00462A2B 83EE FC sub esi, -400462A2E 11DB adc ebx, ebx00462A30 11C0 adc eax, eax00462A32 ^ EB D4 jmp short 00462A08 00462A34 01DB add ebx, ebx00462A36 75 07 jnz short 00462A3F00462A38 8B1E mov ebx, dword ptr [esi]00462A3A 83EE FC sub esi, -400462A3D 11DB adc ebx, ebx00462A3F 11C9 adc ecx, ecx00462A41 EB 52 jmp short 00462A95 00462A43 31C9 xor ecx, ecx // 清零ecx 00462A45 83E8 03 sub eax, 3 // eax - 3 00462A48 72 11 jb short 00462A5B 00462A4A C1E0 08 shl eax, 800462A4D 8A06 mov al, byte ptr [esi] 00462A4F 46 inc esi00462A50 83F0 FF xor eax, FFFFFFFF 00462A53 74 75 je short 00462ACA 00462A55 D1F8 sar eax, 100462A57 89C5 mov ebp, eax00462A59 EB 0B jmp short 00462A66 00462A5B 01DB add ebx, ebx00462A5D 75 07 jnz short 00462A66 00462A5F 8B1E mov ebx, dword ptr [esi] 00462A61 83EE FC sub esi, -400462A64 11DB adc ebx, ebx00462A66 ^ 72 CC jb short 00462A3400462A68 41 inc ecx00462A69 01DB add ebx, ebx00462A6B 75 07 jnz short 00462A74 00462A6D 8B1E mov ebx, dword ptr [esi] 00462A6F 83EE FC sub esi, -400462A72 11DB adc ebx, ebx00462A74 ^ 72 BE jb short 00462A34 00462A76 01DB add ebx, ebx00462A78 75 07 jnz short 00462A81 00462A7A 8B1E mov ebx, dword ptr [esi] 00462A7C 83EE FC sub esi, -400462A7F 11DB adc ebx, ebx00462A81 11C9 adc ecx, ecx00462A83 01DB add ebx, ebx00462A85 ^ 73 EF jnb short 00462A76 00462A87 75 09 jnz short 00462A92 00462A89 8B1E mov ebx, dword ptr [esi] 00462A8B 83EE FC sub esi, -400462A8E 11DB adc ebx, ebx00462A90 ^ 73 E4 jnb short 00462A76 00462A92 83C1 02 add ecx, 200462A95 81FD 00FBFFFF cmp ebp, -500 //迷惑指令00462A9B 83D1 02 adc ecx, 2// 进位加法00462A9E 8D142F lea edx, dword ptr [edi+ebp] // edi + ebp的地址装载到edx,即原来的代码段的地址00462AA1 83FD FC cmp ebp, -4 // 判断跳转标志,EBP小于等于-4就跳00462AA4 76 0E jbe short 00462AB400462AA6 8A02 mov al, byte ptr [edx] //取出代码段的一字节00462AA8 42 inc edx //指向下一个地址00462AA9 8807 mov byte ptr [edi], al //取出的代码放到edi里面00462AAB 47 inc edi //指向下一个代码00462AAC 49 dec ecx //计数器00462AAD ^ 75 F7 jnz short 00462AA6 //关于计数器(ecx)的跳转00462AAF ^ E9 42FFFFFF jmp 004629F6 //向上面跳,跳到add ebx,ebx00462AB4 8B02 mov eax, dword ptr [edx] // 处理输入表00462AB6 83C2 04 add edx, 4 // edx + 4,指向下一个地址00462AB9 8907 mov dword ptr [edi], eax //将代码放到edi00462ABB 83C7 04 add edi, 4// edi + 4,存放代码的地址00462ABE 83E9 04 sub ecx, 4//ecx - 400462AC1 ^ 77 F1 ja short 00462AB400462AC3 01CF add edi, ecx // edi + ecx,指向接收代码的地址的最后一个字节00462AC5 ^ E9 2CFFFFFF jmp 004629F6 //跳到add ebx,ebx00462ACA 5E pop esi00462ACB 89F7 mov edi, esi00462ACD B9 81260000 mov ecx, 268100462AD2 8A07 mov al, byte ptr [edi] //指向我们原来代码段的代码,取出到AL里面00462AD4 47 inc edi //指向下一个字节00462AD5 2C E8 sub al, 0E8 //处理CALL00462AD7 3C 01 cmp al, 1 //判断al是否大于100462AD9 ^ 77 F7 ja short 00462AD2 //循环,到下一个CALL的第一个字节为止00462ADB 803F 14 cmp byte ptr [edi], 1400462ADE ^ 75 F2 jnz short 00462AD200462AE0 8B07 mov eax, dword ptr [edi] //取出里面的地址,里面的地址是定位CALL 的绝对地址要用到的00462AE2 8A5F 04 mov bl, byte ptr [edi+4] //得到下条地址的开始字节放到AL里面,CALL绝对地址就是下条指令开始+刚才上面取出的那个数字00462AE5 66:C1E8 08 shr ax, 8 // ax右移8位00462AE9 C1C0 10 rol eax, 10 //eax算术左移8位00462AEC 86C4 xchg ah, al //交换内容00462AEE 29F8 sub eax, edi //eax - edi00462AF0 80EB E8 sub bl, 0E8 //再减去E800462AF3 01F0 add eax, esi //eax + esi,其中esi是代码段开始的地方00462AF5 8907 mov dword ptr [edi], eax //这里处理CALL的地址,算出CALL的偏移到EDI里面00462AF7 83C7 05 add edi, 5 //edi + 5,指向call的后面00462AFA 88D8 mov al, bl //bl的内容放到al中00462AFC ^ E2 D9 loopd short 00462AD7 //循环处理CALL,其中ecx作为计数器00462AFE 8DBE 00F00500 lea edi, dword ptr [esi+5F000] //代码段的起始地址+5F00000462B04 8B07 mov eax, dword ptr [edi] //现在EDI指向我们的代码的输入表00462B06 09C0 or eax, eax //eax 或eax ,判断eax是否为零00462B08 74 3C je short 00462B4600462B0A 8B5F 04 mov ebx, dword ptr [edi+4] //取得这个地址的数据放到ebx00462B0D 8D8430 AC2D0600 lea eax, dword ptr [eax+esi+62DAC] // 取得外壳段的KERNEL32.DLL的地址放eax00462B14 01F3 add ebx, esi //我们代码段的起始地址加上刚才取出的那个数据00462B16 50 push eax //kernel32.dll的地址00462B17 83C7 08 add edi, 8 //edi + 800462B1A FF96 4C2E0600 call dword ptr [esi+62E4C] //装载kernel32.dll00462B20 95 xchg eax, ebp //交换数据,即eax指向kernel32.dll的地址00462B21 8A07 mov al, byte ptr [edi] //取得现在的EDI的地址指向的数据放到AL 00462B23 47 inc edi //指向下一个函00462B24 08C0 or al, al //al 或al,判断al是否为零00462B26 ^ 74 DC je short 00462B0400462B28 89F9 mov ecx, edi //取出的函数的名字放到ecx里面00462B2A 57 push edi //函数名字压栈00462B2B 48 dec eax //eax - 100462B2C F2:AE repne scas byte ptr es:[edi]00462B2E 55 push ebp //kernel32.dll的基址00462B2F FF96 502E0600 call dword ptr [esi+62E50] //外壳的GetProcaddress00462B35 09C0 or eax, eax //eax或eax,得到函数的地址00462B37 74 07 je short 00462B4000462B39 8903 mov dword ptr [ebx], eax //处理输入表00462B3B 83C3 04 add ebx, 4 //ebx + 4,指向下一个输入表的地址00462B3E ^ EB E1 jmp short 00462B2100462B40 FF96 602E0600 call dword ptr [esi+62E60]00462B46 8BAE 542E0600 mov ebp, dword ptr [esi+62E54] //VirtualProtect的地址放到ebp00462B4C 8DBE 00F0FFFF lea edi, dword ptr [esi-1000] //指向PE头,即映像基址00462B52 BB 00100000 mov ebx, 1000 //把1000放到ebx,即ebx = 100000462B57 50 push eax00462B58 54 push esp00462B59 6A 04 push 400462B5B 53 push ebx00462B5C 57 push edi00462B5D FFD5 call ebp //改变属性00462B5F 8D87 1F020000 lea eax, dword ptr [edi+21F] //现在eax指向PE头中区段的偏移起始位置00462B65 8020 7F and byte ptr [eax], 7F //改写区段名字00462B68 8060 28 7F and byte ptr [eax+28], 7F //改写区块属性第一个区块的属性00462B6C 58 pop eax00462B6D 50 push eax00462B6E 54 push esp00462B6F 50 push eax00462B70 53 push ebx00462B71 57 push edi00462B72 FFD5 call ebp00462B74 58 pop eax00462B75 61 popad //恢复现场00462B76 8D4424 80 lea eax, dword ptr [esp-80]00462B7A 6A 00 push 000462B7C 39C4 cmp esp, eax00462B7E ^ 75 FA jnz short 00462B7A00462B80 83EC 80 sub esp, -8000462B83 ^ E9 109FFEFF jmp 0044CA98 //跨区段的转移,跳到OEP 00462B88 A0 2B4600B0 mov al, byte ptr [B000462B]00462B8D 2B46 00 sub eax, dword ptr [esi]00462B90 9C pushfdDelphi7.0的OEP:0044CA98 55 push ebp0044CA99 8BEC mov ebp, esp0044CA9B 83C4 F0 add esp, -100044CA9E B8 B8C84400 mov eax, 0044C8B80044CAA3 E8 2091FBFF call 00405BC80044CAA8 A1 B8DF4400 mov eax, dword ptr [44DFB8]0044CAAD 8B00 mov eax, dword ptr [eax]0044CAAF E8 9CE6FFFF call 0044B150这个方法很简单,就是从壳的开始一直跟踪,直到来到OEP,没有什么技巧!大家应该熟悉各个程序的OEP,并且熟练的掌握这种方法!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三十二章-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”。

相关文档
最新文档