当前位置: 首页 > news >正文

OD和XDBG详解

目录

  • OD基本界面和功能
  • OD简单调试和各种断点
  • XDBG和OD用法的区别
  • 栈的注意点

OD基本界面和功能

  • 整个窗口分为了四个界面, 左上是反汇编窗口, 左下是内存窗口, 右上是显示寄存器信息的窗口, 右下是调用堆栈窗口, ctrl + G能进行内存的跟随
    在这里插入图片描述

  • 进入OD的时候, 一般是启动一个程序, 然后对这个程序进行附加, 有些进程是不能附加的, 有些有保护, 有些是系统进程

  • 刚进行附加的时候, 会将程序给断住, 点击F9就能让他运行起来

  • alt + e我们能看到有很多的模块, 我们选择exe的模块, 我们之前说了模块里面包含了代码段, 数据段, 所以我们选择这个模块就能看到这个程序写的代码了

在这里插入图片描述

  • 点击记录,这里面记录了我们OD所有使用过程
  • 可执行模块就是刚才的alt + e的功能
  • 点击内存, 这里面包含了所有的内存区域, 包括其他模块的

在这里插入图片描述

  • 我们的OD是可以申请内存的,我们申请的内存也可以在上面的内存窗口中看到

在这里插入图片描述

  • 点击线程, 可以查看这个进程一共有多少个线程

  • 窗口, 句柄, 没有什么可说的

  • 点击CPU, 这里的CPU并不是硬件上的CPU, 而是C​​ ommon ​​P​​ arser ​​U​​ tility(通用解析器工具),就是我们的主界面
    在这里插入图片描述

  • 点击调用堆栈, 这个调用堆栈不管在哪里都是比较重要的, 能查看某一个函数是如何一步一步通过哪些函数调用过来的, 地址是堆栈的地址, 堆栈是调用该函数的地址
    在这里插入图片描述

  • 点击断点, 能显示条件断点(F2断点,int3,cc), 硬件断点和内存断点是不会显示的

  • 点击RUN跟踪, 点击打开或清除RUN跟踪, 就能对当前光标存在的代码进行跟踪
    在这里插入图片描述

  • 如果有寄存器发生了访问操作, 就会新增一条记录
    在这里插入图片描述

  • 点击调试, 下面都是你断住的时候, 调试需要用到的按键
    在这里插入图片描述

  • 点击硬件断点, 当你有硬件断点的时候, 就会显示你的硬件断点的信息, 断的地址, 长度, 中断条件
    在这里插入图片描述

  • 点击插件, 点击OllyDump, 作用就是导出版本

在这里插入图片描述

OD简单调试和各种断点

  • 如果你分析代码后, 显示出了问题, 就需要点击从模块中删除分析, 分析代码的作用是在不运行程序的情况下读取源代码
    在这里插入图片描述

  • 右键的二进制编辑 用00填充 用FF填充 可以需修改这个内存的值, 二进制赋复制就是将这些地址的值进行复制
    在这里插入图片描述

  • 右键的修改也能对内存进行修改, 可以直接双击来修改(双击的修改就是二进制的编辑)

  • Hex, 文本, 短型, 长型, 浮点, 反汇编, 都是数据的查看方式, 我们习惯性用的时长型的地址来查看

  • 右键反汇编窗口 点击注释, 能进行添加注释

在这里插入图片描述

  • 右键查找用户定义的注释, 能对你的注释进行快速的定位
    在这里插入图片描述

1.int3 断点(也称为 ​​软件断点​​)是调试器(如 GDB、WinDbg、Visual Studio、ODB 等)用来暂停程序执行的一种机制。它的核心原理是 ​​通过修改目标代码,插入一个特殊的机器指令 0xCC(即 int3)​​,当 CPU 执行到这条指令时,会触发一个 ​​断点异常​​,调试器捕获该异常后暂停程序,让开发者可以检查程序状态(如变量、寄存器、调用栈等)。

2.条件断点, 也是int3断点的一种, 符合某一条件才会断住
3.内存断点,分为内存访问断下和内存写入断下, 右键 点击断点
在这里插入图片描述
4.硬件断点​​是一种由 CPU 直接提供的调试功能。调试器通过设置 CPU 内部的​​调试寄存器​​来指定一个内存地址和条件,当程序运行​​精确匹配​​这些条件时,CPU 会​​自动暂停​​执行并通知调试器,整个过程无需修改任何程序代码。

  • 和软件断点使用上的区别, 内存断点会在即将开始执行但未执行时断住, 而硬件断点是在刚执行完之后断住, 因为这是 x86/x86-64 架构硬件断点的“陷阱”型异常的特点,为了保证语句的原子性, 它会在导致异常的指令【完成之后】才被报告给 CPU。​
    在这里插入图片描述

  • 练习, 如何追这个eax

eax来源于, [esp +194], 这个194是十六进制, 我们想知道此时, 也就是代码刚走到这一行的时候, [esp + 194]到底是谁, 我们知道esp是栈顶的地址, 此时栈里的数据排列:

1.eax(4字节)(栈顶)
2.edi(4字节)
3.esi(4字节)
4.ebp(4字节)
5.ebx(4字节)
180(十六进制)个字节的空间
6.eax(4字节)
7.0188BBDE(4字节)
8.-1(4字节)

在5和6之间, esp加上了0x180, 说明给栈开辟了0x180个字节, esp + 0x194就是从栈顶往下数, 哪个位置是第0x194个字节, 最后的结果就是eax

在这里插入图片描述

  • 当你追到基地址的时候, 写表达式的时候, 需要
  • 1.将基地址减去 "xxx.exe"的地址
  • 2.写成 减后的基地址 + "xxx.exe"的形式

在这里插入图片描述

XDBG和OD用法的区别

XDBG和OD的界面功能基本上是一样的, F8单步步过, F7单步步进, F4执行到

  • 点击选项, 设置, 把系统断点, 回调函数, 入口断点, 附加断点不勾选上

在这里插入图片描述

  • 忽略异常区间我们把内存的区域都忽略, 为了方便使用

在这里插入图片描述

  • 启用高亮模式, 和加0x前缀给勾选上

在这里插入图片描述

  • 如何查找注释, 点击这个按钮

在这里插入图片描述

  • 搜索常量的地方, 右键, 搜索
    在这里插入图片描述
  • OD中的dd命令 XDBG用的是dump, dump也不是很方便, 我们直接用ctrl + G和OD的操作一样

在这里插入图片描述

  • 我们之前拿到了基地址, 还要用计算器来计算出exe的偏移, XDBG为我们直接提供了基地址减去exe的偏移
    在这里插入图片描述

  • XDBG还显示更多的寄存器的值, OD里是不显示以下寄存器的值的
    在这里插入图片描述

  • 在XDBG中, 点击函数头部, 点击A快捷键, 能对该段函数进行代码分析, 作用是能知道这个函数的结束ret在哪, ctrl + a是对整个模块进行静态分析, 并不建议这样

  • 我们在追数据的时候, 不仅仅只能通过代码来分析, 我们还可以通过该程序中显示的字符串来分析, 这样我们就可以快速定位到是哪个代码用了这个字符串
    在这里插入图片描述

栈的注意点

追到在函数头部的时候, ebp指向的是旧的ebp, ebp + 4是函数的call地址, ebp + 8是函数的第一个参数, ebp + C是函数的第二个参数…
在函数头部, esp指向的是函数的call地址, esp +4是函数的第一个参数, esp + 8是函数的第二个参数…

函数内部的栈帧​
func:push ebp           ; 保存旧的 EBP(ESP 减 4)mov ebp, esp       ; EBP = 当前 ESPsub esp, 16        ; 为局部变量预留空间
低地址
| 局部变量...   |  <-- ESP
----------------
| 旧的 EBP      |  <-- EBP (当前栈帧)
----------------
| 返回地址      |  <-- EBP + 4
----------------
| 参数1         |  <-- EBP + 8
----------------
...
----------------
| 参数N         |  <-- EBP + (8 + 4*(N-1))
----------------
高地址
当调用函数时,CALL指令会自动将 ​​返回地址(EIP)​​ 压入栈,此时栈的布局:
低地址
----------------
| 返回地址      |  <-- ESP (当前栈顶)
----------------
| 参数1         |  <-- ESP + 4
----------------
...
----------------
| 参数N         |  <-- ESP + (4 + 4*(N-1))
----------------
高地址
http://www.xdnf.cn/news/1489141.html

相关文章:

  • Java捕获子线程异常以及主线程感知子线程异常
  • 第4篇 conda install pytorch==2.0.0报错
  • Keil快捷键代码补全
  • Photoshop图层间的关系
  • ⚡ 浪涌测试波形全解析:从标准到应用
  • redis的高可用(哨兵)
  • Redis(49)Redis哨兵如何实现故障检测和转移?
  • PicoZed™ SDR Z7035/AD9361
  • Shell 脚本自动安装 Nginx
  • OSPF基础部分知识点
  • Redis基础(含常用命令等以快速入门)
  • 学习结构体
  • 常见的内存泄露情况汇总
  • STM32 开发(三十三)STM32F103 片内资源 —— 直接存储 DMA 实战 编码详解
  • TypeORM 入门教程之 `@OneToOne` 关系详解
  • Day23_【机器学习—集成学习(5)—Boosting—XGBoost算法】
  • Python struct模块 | 使用pack函数进行字节序打包
  • k8s镜像推送到阿里云,使用ctr推送镜像到阿里云
  • Python实战:打造简易人脸识别门禁系统
  • MySQL 主从读写分离架构
  • UserManagement.vue和Profile.vue详细解释
  • Windows 内存整理和优化工具 - Wise Memory Optimize
  • Java初体验
  • 缓存无处不在
  • fps:AI系统
  • 2.TCP深度解析:握手、挥手、状态机、流量与拥塞控制
  • 火山 RTC 引擎15 拉流 推流 地址生成器 、合流转推 开关
  • Vulkan 学习(20)---- UniformBuffer 的使用
  • 【系统分析师】第7章-基础知识:软件工程(核心总结)
  • 计算机毕设选题:基于Python+Django的B站数据分析系统的设计与实现【源码+文档+调试】