OllyDbg动态调试工具的使用
动态调试工具:OllyDbg,WinDbg
静态调试工具:ida
本次我将学习OllyDbg动态调试工具的使用
- OllyDbg是一种具有可视化界面的32位汇编分析调试器,是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。
一、OllyDbg的界面和配置
-
下面为OllyDbg的界面
-
子窗口的快捷方式
-
汇编窗口
第一个为虚拟地址:一般情况下,同一个程序的同一条指令在不同系统环境下此值相同。
-
信息窗口
-
数据窗口
数据窗口主要的即为程序或者内存的数据,右键可以切换显示方式.
-
寄存器窗口
这里介绍几个通用寄存器:
ESP:指向堆栈栈顶
EBP:大部分用来定位局部变量和参数
-
栈窗口(主要存放线程的临时数据,可以用于动态调试)
-
-
OllyDbg的配置
选项--->界面--->目录
二、调试技巧与常用快捷键
-
领空:实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。
-
如004013F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统DLL所在的地址空间。
-
程序通常读取文本框内容的字符串用的是以下两个函数:
- GetDlgItemTextA (GetDlgItemTextw)
- GetwindowTextA (GetwindowTextw)
-
跳转地址:
- 在jmp或者call指令上按回车,跟踪进入
- +号前进一步;-号后退一步
-
关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里边的,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。
-
修改汇编指令:
- 双击反汇编窗口,按下空格
- 修改内存,编辑二进制代码
- Ctrl+E,不同窗口编辑不同地方
-
注释:
- 左键点击注释列
- 右键点击注释,添加注释
- 快捷方式 ---- 分号注释
-
添加标签:
- 只能给地址添加标签,不能是[ebp+8]
- 冒号(快捷方式)
-
查找指定地址:
- Ctrl+G,输入地址或者API函数名
- 查找API地址==>(在内存窗口使用dp+MessageBoxA也能做到)
-
字符串搜索:使用插件 ----- 中文搜索引擎,右键—查看—所有文本字符串
-
内存窗口命令栏:
- dd +地址 看该地址内存
- dp +MessageBoxA 定位API函数
-
OD常用快捷键
- F2:设置断点。只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)
- F8:单步跳过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)
- F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)
- F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)
- F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)
- CTR + F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)
- ALT + F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)
- Ctrl+F2: 重新启动程序
- Ctrl+F:搜索一条指令
- Ctrl+A:分析代码
三、实践一(爆破一个软件)
既然已经下载完了ollydbg
,并且也了解了它的界面以及快捷键,下面就让我们来爆破一个软件试试。
-
首先导入要破解的程序,运行后的结果如下,弹出一个用户框。
-
因为不知道正确的用户名,序列号是什么,所以我随便输入个用户名和序列号,提示错误。我们就是要通过ollydbg进行动态调试,顺利进入系统中。
-
首先打开插件——api断点设置工具,对需要的函数打上断点,这里我们把
GetWindowTestA
和GetDlgItemTextA
前面打勾,通过这两个函数我们可以获取输入框的值。 -
之后,点击快捷键F9运行程序,这时弹出了输入框,我们再随便填一个数。点击check,此时程序运行到打了断点的位置。
-
按快捷键
ctrl+F9
,执行到返回。 -
按快捷键
F8
,跳转到调用那个函数的那一步的下面一行。可以看到有两个GetDlgItemTextA
方法,代表我们有两个输入框,调用了两次。
-
继续F8运行下一步,直到途中所示的位置,可以看到两个输入框的值已压栈,此时的这个函数我们猜测便是判断正误的函数。
-
经过第七步我们猜测下面的语句是跳转错误的语句,于是我们在那条语句上按快捷键
F2
打上一个断点。 -
修改此句汇编语言为下图中所示将JE改为JNE
-
之后直接运行F9,可以看到运行成功了。
-
保存文件,选中修改的那一行,右键--->复制到可执行文件--->然后弹出下面窗口--->右键--->保存文件
-
点击新保存的文件,随便输入两串字符串,可以看到都能运行通过。
四、常用断点之INT3断点
原理:
-
替换指令,也就是换int3指令。
-
od加测到int3指令之后会引发一个异常并捕获它,这是程序就会中断。
-
INT3指令给删除掉,还原之前的代码
优点:可以无限的下int3断点
缺点:很容易被检测
五、汇编指令
通过实验一我没看出能够读懂汇编指令的重要性,其中能够看懂跳转指令尤为重要,并且有时修改要知道其相反指令,下面我总结出了一些常用的跳转汇编指令。
指 令 | 描 述 | 条 件 | 别 名 | 相 反 指 令 |
---|---|---|---|---|
JC | 如果进位位被置位则跳转 | 进位标志=1 | JB,JNAE | JNC |
JNC | 如果进位位没有置位则跳转 | 进位标志=0 | JNB,JAE | JC |
JZ | 如果0标志被置位则跳转 | 0标志=1 | JE | JNZ |
JNZ | 如果0标志没有置位则跳转 | 0标志=0 | JNE | JZ |
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
---|---|---|---|---|
JS | 如果符号位被置位则跳转 | 符号标志=1 | JNS | |
JNS | 如果符号位没有被置位则跳转 | 符号标志=0 | JS | |
JO | 如果溢出标志置位则跳转 | 溢出标志=1 | JNO | |
JNO | 如果溢出标志没有置位则跳转 | 溢出标志=0 | JO | |
JP | 如果奇偶校验位被置位则跳转 | 奇偶校验标志=1 | JPE | JNP |
JPE | 如果奇偶校验位为偶校验则跳转 | 奇偶校验标志=1 | JP | JPO |
JNP | 如果奇偶校验位没有被置位则跳转 | 奇偶校验标志=0 | JPO | JP |
JPO | 如果奇偶校验位为奇校验则跳转 | 奇偶校验标志=0 | JNP | JPE |
使用无符号数比较的JCC指令
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
---|---|---|---|---|
JA | 如果超过(>)则跳转 | 进位标志=0,0标志=0 | JNBE | JNA |
JNBE | 如果不低于或等于(不 <=)则跳转 | 进位标志=0,0标志=0 | JA | JBE |
JAE | 如果超过或等于(>=)则跳转 | 进位标志=0 | JNC,JNB | JNAE |
JNB | 如果不低于则跳转(不 <) | 进位标志=0 | JNC,JAE | JB |
JB | 如果低于(<)则跳转 | 进位标志=1 | JC,JNAE | JNB |
JNAE | 如果不超过或等于(不>=)则跳转 | 进位标志=1 | JC,JB | JAE |
JBE | 如果低于或等于(<=)则跳转 | 进位标志=1或0标志=1 | JNA | JNBE |
JNA | 如果不超过(不>)则跳转 | 进位标志=1或0标志=1 | JBE | JA |
JE | 如果相等(=)则跳转 | 0标志=1 | JZ | JNE |
JNE | 如果不相等(<>)则跳转 | 0标志=0 | JNZ | JE |
使用有符号数比较的JCC指令
指 令 | 描 述 | 条 件 | 别 名 | 相反指令 |
---|---|---|---|---|
JG | 如果大于(>)则跳转 | 符号标志=溢出标志或0标志=0 | JNLE | JNG |
JNLE | 如果小于或等于(<=)则跳转 | 符号标志=溢出标志或0标志=0 | JG | JLE |
JGE | 如果大于或等于(>=)则跳转 | 符号标志=溢出标志 | JNL | JGE |
JNL | 如果不小于(不<)则跳转 | 符号标志=溢出标志 | JGE | JL |
JL | 如果小于(<)则跳转 | 符号标志<>溢出标志 | JNGE | JNL |
JNGE | 如果大于或等于(>=)跳转 | 符号标志<>溢出标志 | JL | JGE |
JLE | 如果小于或等于(<=)跳转 | 符号标志<>溢出标志或0标志=1 | JNG | JNLE |
JNG | 如果不大于(不>)则跳转 | 符号标志<>溢出标志或0标志=1 | JLE | JG |
JE | 如果等于(=)则跳转 | 0标志=1 | JZ | JNE |
JNE | 如果不等于(<>)则跳转 | 0标志=0 | JNZ | JE |
五、查壳
软件脱壳含义:软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉。 在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。 它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。 由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为“壳”了。
PEID简介:
PEiD是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470种PE文档的加壳类型和签名,可以探测大多数PE文件封包器、加密器和编译器。
- 首先,运行PeiD,其界面为:
-
定位要查壳的软件
-
下图说明这个软件是没有加壳的。Borland Delphi 2.0 不是壳,是一门编程语言,所以是用Borland Delphi 2.0编写的。如果查到了是aspack的。那就说明是加了aspack的壳。您可以用专门脱aspack脱壳机来脱壳。不过。用自动的脱壳机。
六、实践二
解题步骤:
-
用peid查壳,确定没有壳,所以可以直接进行反编译。
-
查看运行效果
-
随机输入一个序列号,返回信息为错误的
-
在ollydbg中打开此程序
-
右键,找到中文搜索引擎,找到智能搜索
-
拉到最后,可以看到提示信息,正确为
Thanks you made it
,错误为Wrong Code DUDE
-
双击进去
-
接下来进行静态分析,可以看到①处是跳转,推测如果满足条件则跳转到成功处,以此来判断②处为判断字符串是否相同,如果一样跳转成功,如果不一样跳转失败。由此分析③处函数为接收字符串的函数。
-
在0042D526处
F2
下断点。 -
运行并随机输入一串序列号
-
运行到call处读取到字符串,所以这个字符串是读取字符串的函数,然后下一步将字符串赋值给EAX,内置常量字符串Benadry1赋值给EDX.
-
我们来看一下是如何比较的,按F7进入到比较函数中
-
可以看到将EAX赋值到ESI,将EDX赋值到EDI,然后再进行比较。一样则为0,不一样则为1.JE是为0则跳转,之后一行的TEST是检测输入的字符串是否为空,如果空则跳转,不为空不跳。之后又检测EDI是否为空。之后可以继续分析。
-
按crtl+F9,到达return处。
-
由此可以看出我们分析的是对的,如果判断相等则跳转到成功,不相等则不跳转到失败,所以我们点击空格修改汇编指令,改为JMP,强制性跳转
-
可以看到成功了
七、总结
经过本次学习我学会了使用OllyDbg动态调试工具,在学习过程中我认为一个程序的逻辑思维非常重要,只有你有着这种逻辑思维,才能够判断出哪一句该干什么,猜测下一步做什么,才能够破解出来。其次还很重要的是要能够看得懂汇编语言,这也是非常重要的。
标签:标志,指令,OllyDbg,跳转,如果,动态,断点,调试 From: https://www.cnblogs.com/Ggg-blog/p/17062924.html