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))
----------------
高地址