首页 > 其他分享 >OllyDbg动态调试工具的使用

OllyDbg动态调试工具的使用

时间:2023-01-20 17:46:46浏览次数:34  
标签:标志 指令 OllyDbg 跳转 如果 动态 断点 调试

OllyDbg动态调试工具的使用

动态调试工具:OllyDbg,WinDbg

静态调试工具:ida

本次我将学习OllyDbg动态调试工具的使用

  • OllyDbg是一种具有可视化界面的32位汇编分析调试器,是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。

一、OllyDbg的界面和配置

  • 下面为OllyDbg的界面

    image-20221112170955191
    1. 子窗口的快捷方式

    2. 汇编窗口

      image-20221112192844921

      第一个为虚拟地址:一般情况下,同一个程序的同一条指令在不同系统环境下此值相同。

    3. 信息窗口

    4. 数据窗口

      数据窗口主要的即为程序或者内存的数据,右键可以切换显示方式.

      image-20221112173457390
    5. 寄存器窗口

      image-20221112173046004

      这里介绍几个通用寄存器:

      ​ ESP:指向堆栈栈顶

      ​ EBP:大部分用来定位局部变量和参数

    6. 栈窗口(主要存放线程的临时数据,可以用于动态调试)

  • OllyDbg的配置

    选项--->界面--->目录

    image-20221112171753509

二、调试技巧与常用快捷键

  1. 领空:实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。

  2. 如004013F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统DLL所在的地址空间。

  3. 程序通常读取文本框内容的字符串用的是以下两个函数:

    • GetDlgItemTextA (GetDlgItemTextw)
    • GetwindowTextA (GetwindowTextw)
  4. 跳转地址:

    • 在jmp或者call指令上按回车,跟踪进入
    • +号前进一步;-号后退一步
  5. 关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里边的,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。

  6. 修改汇编指令:

    • 双击反汇编窗口,按下空格
    • 修改内存,编辑二进制代码
    • Ctrl+E,不同窗口编辑不同地方
  7. 注释:

    • 左键点击注释列
    • 右键点击注释,添加注释
    • 快捷方式 ---- 分号注释
  8. 添加标签:

    • 只能给地址添加标签,不能是[ebp+8]
    • 冒号(快捷方式)
  9. 查找指定地址:

    • Ctrl+G,输入地址或者API函数名
    • 查找API地址==>(在内存窗口使用dp+MessageBoxA也能做到)
  10. 字符串搜索:使用插件 ----- 中文搜索引擎,右键—查看—所有文本字符串

  11. 内存窗口命令栏:

    • dd +地址 看该地址内存
    • dp +MessageBoxA 定位API函数
  12. 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,并且也了解了它的界面以及快捷键,下面就让我们来爆破一个软件试试。

  1. 首先导入要破解的程序,运行后的结果如下,弹出一个用户框。

    image-20221112195930333
  2. 因为不知道正确的用户名,序列号是什么,所以我随便输入个用户名和序列号,提示错误。我们就是要通过ollydbg进行动态调试,顺利进入系统中。

    image-20221112200259375
  3. 首先打开插件——api断点设置工具,对需要的函数打上断点,这里我们把GetWindowTestAGetDlgItemTextA前面打勾,通过这两个函数我们可以获取输入框的值。

    image-20221112200806213
  4. 之后,点击快捷键F9运行程序,这时弹出了输入框,我们再随便填一个数。点击check,此时程序运行到打了断点的位置。

    image-20221112202354227 image-20221112201525498
  5. 按快捷键ctrl+F9,执行到返回。

    image-20221112202616877
  6. 按快捷键F8,跳转到调用那个函数的那一步的下面一行。可以看到有两个GetDlgItemTextA方法,代表我们有两个输入框,调用了两次。

image-20221112203615856
  1. 继续F8运行下一步,直到途中所示的位置,可以看到两个输入框的值已压栈,此时的这个函数我们猜测便是判断正误的函数。

    image-20221112204845761

  2. 经过第七步我们猜测下面的语句是跳转错误的语句,于是我们在那条语句上按快捷键F2打上一个断点。

    image-20221112205602711

  3. 修改此句汇编语言为下图中所示将JE改为JNE

    image-20221112205918821

  4. 之后直接运行F9,可以看到运行成功了。

    image-20221112210217291

  5. 保存文件,选中修改的那一行,右键--->复制到可执行文件--->然后弹出下面窗口--->右键--->保存文件

    image-20221112210538186

  6. 点击新保存的文件,随便输入两串字符串,可以看到都能运行通过。

    image-20221112210701523

    image-20221112210728776

四、常用断点之INT3断点

原理:

  1. 替换指令,也就是换int3指令。

  2. od加测到int3指令之后会引发一个异常并捕获它,这是程序就会中断。

  3. 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文件封包器、加密器和编译器。

  1. 首先,运行PeiD,其界面为:
image-20221114141024004
  1. 定位要查壳的软件

    image-20221114141650006

  2. 下图说明这个软件是没有加壳的。Borland Delphi 2.0 不是壳,是一门编程语言,所以是用Borland Delphi 2.0编写的。如果查到了是aspack的。那就说明是加了aspack的壳。您可以用专门脱aspack脱壳机来脱壳。不过。用自动的脱壳机。

    image-20221114142415754

六、实践二

解题步骤:

  1. 用peid查壳,确定没有壳,所以可以直接进行反编译。

    image-20221114000016924

  2. 查看运行效果

    image-20221114000109346

  3. 随机输入一个序列号,返回信息为错误的

    image-20221114000251147

  4. 在ollydbg中打开此程序

    image-20221114000433577
  5. 右键,找到中文搜索引擎,找到智能搜索

    image-20221114000550586

  6. 拉到最后,可以看到提示信息,正确为Thanks you made it,错误为Wrong Code DUDE

    image-20221114000718294

  7. 双击进去

    image-20221114000834055

  8. 接下来进行静态分析,可以看到①处是跳转,推测如果满足条件则跳转到成功处,以此来判断②处为判断字符串是否相同,如果一样跳转成功,如果不一样跳转失败。由此分析③处函数为接收字符串的函数。

    image-20221114001335348

  9. 在0042D526处F2下断点。

    image-20221114001856149

  10. 运行并随机输入一串序列号

    image-20221114002007762

  11. 运行到call处读取到字符串,所以这个字符串是读取字符串的函数,然后下一步将字符串赋值给EAX,内置常量字符串Benadry1赋值给EDX.

    image-20221114002359644
  12. 我们来看一下是如何比较的,按F7进入到比较函数中

    image-20221114002751603

    image-20221114002810702

  13. 可以看到将EAX赋值到ESI,将EDX赋值到EDI,然后再进行比较。一样则为0,不一样则为1.JE是为0则跳转,之后一行的TEST是检测输入的字符串是否为空,如果空则跳转,不为空不跳。之后又检测EDI是否为空。之后可以继续分析。

    image-20221114003115713

  14. 按crtl+F9,到达return处。

    image-20221114004101067

  15. 由此可以看出我们分析的是对的,如果判断相等则跳转到成功,不相等则不跳转到失败,所以我们点击空格修改汇编指令,改为JMP,强制性跳转

    image-20221114004624023

  16. 可以看到成功了

    image-20221114004540211

七、总结

​ 经过本次学习我学会了使用OllyDbg动态调试工具,在学习过程中我认为一个程序的逻辑思维非常重要,只有你有着这种逻辑思维,才能够判断出哪一句该干什么,猜测下一步做什么,才能够破解出来。其次还很重要的是要能够看得懂汇编语言,这也是非常重要的。

标签:标志,指令,OllyDbg,跳转,如果,动态,断点,调试
From: https://www.cnblogs.com/Ggg-blog/p/17062924.html

相关文章

  • 您是否存在想在浏览器动态编译razor的组件的想法?
    不知道是否有人跟我一样想在浏览器上直接可以动态的编译blazor的一些组件库?而不是通过引用NuGet以后才能查看到效果,并且在使用别人的组件的时候可以在动态的调整组件的一些......
  • 如何进行动态ip的域名解析设置?
    如何进行动态ip的域名解析设置?目前,有一部分域名客户出于节省成本、技术验证等因素,会把自己家里或是部门的电脑用来当做Web服务器、mail服务器或是ftp服务器。如果想提供给......
  • form-editor 一种基于虚拟DOM的动态表单设计器
    项目地址github: https://github.com/xjf7711/form-editor项目环境1、全局和本地安装TypeScript2、初始化、安装webpack、webpack-cli、webpack-dev-server、webpack-......
  • Web安全入门与靶场实战(11)- 静态资源和动态资源
    在一次HTTP请求和响应的过程中,客户端所请求以及服务器所返回的内容就称为Web资源。Web资源总体上分为静态资源和动态资源两类。分类依据:服务器是否需要对这些资源处理之后再......
  • 【学习笔记】动态树 Link-Cut Tree
    -闲话LCT优秀博客:\(\color{black}{\textsf{F}}\color{red}{\textsf{lashHu}}\)大佬的cnblogs:https://www.cnblogs.com/flashhu/p/8324551.html-动态树Link-Cut......
  • 调试出错
    Segmentationfault结构体内部指针声明时,也需要分配空间voidMyEnQue(Queueque,inte){QNode*cur=(QNode*)malloc(sizeof(QNode));cur->val=e;que.re......
  • 串口调试助手的数据保存问题
    提问: 本人在做FPGA的数据采集系统,采集到的数据通过串口发送给串口调试助手,现在用的是可以显示波形的VOFA+,但是保存数据为csv文件时,数据只有一列,不像示波器保存的数据有时......
  • Ant Design Table 如何动态自定义?Ant Popover 遮挡?
    项目场景:基于electron+Vue+node.js+express+mysql+evanpatchouli-mysql+Ant-Design-Vue,编写一款属于自己的轻量级MySQL数据库界面工具。问题列表如何动态......
  • Ceph基于普通用于挂载块存储、实现对块存储的动态空间拉伸
      客户端使用普通账户挂载并使用RBD  测试客户端使用普通账户挂载并使用RBD   创建普通账户并授权  创建普通账户cephadmin@ceph-deploy:~/ceph-cluster$......
  • jQ动态回显ajax请求的值
    jquery循环数组输出显示在html页面jquery没有双向数据绑定,但是很多需求确实需要我们从后台接收到数组或者对象循环显示在前台页面上,这时我们可以用字符串拼接,元素添加......