前言
本系列针对的是windbg在逆向工程中的应用,不涉及源码调试的讨论,只涉及汇编级别的操作。定位是针对有OllyDbg基础希望学习Windbg(至少应当有汇编基础)的人提供的类似指令手册的存在。按照个人理解对于windbg的手册上的命令进行了简单的整理。
其中安装,配置符号,加载可执行文件(附加或直接打开)部分网上资料非常多,在此就不加以涉及,且本文不提供任何示例,建议自己编写文件调试以便于理解。
调试基础命令
-
.reload 重新加载
-
g 运行
- gu 运行到当前函数返回
-
p 单步步过
- pc/pt 运行到下一个call/ret
- pct 运行到下一个call或ret
- pa 运行到某个地址
- ph 运行到下一个分支跳转(jmp、call、ret…)
-
t 单步步入
- tb 运行到下一个分支跳转
- tc/tt/tct/ta与p相同
-
b breakpoint
- 三种参数格式
- bp main+3 函数符号偏移下断
- bp 00401000 绝对虚拟地址下断
- bp ‘source.c:31’ 存在源码的情况下可用
- C++方法下断
- bp MyClass::MyMethod 或bp MyClass__MyMethod MASM格式
- bp @@( MyClass::MyMethod ) C++表示语法
- bp 正常断点
- bl 列出所有断点
- ba 内存访问断点,ba access size addr(size以BYTE为单位,access与size间没有空格),例:ba e1 addr1,ba w4 localVar
项 行为 (执行) 当CPU取指定地址的指令时中断到调试器。(执行时size只能为1) (读写) 当CPU取指定地址的指令时中断到调试器。 (访问) 当CPU写指定地址时中断到调试器。 (i/o) (Microsoft Windows XP和之后版本、仅内核模式、仅x86系统)当指定Address的I/O端口被访问时中断到调试器。 - bc 删除断点(参数为断点ID)
- bd/be 禁止/允许断点
- bu 相对而言,bp断点会被立刻转化为地址(例如bp Cpp1!main),而bu则是使用相对地址(相对符号的偏移),当符号地址改变bu地址也会发生改变,而bp则不变
- 三种参数格式
读写内存指令
- d* 显示指定内存、范围的内容
- da ASCII格式显示内存
- db BYTE格式显示内存(hex)
- dd DWORD格式
- dt 显示数据类型以及组成元素(r选项递归显示),使用示例 dt [-option] [module]!Name [addr] 或dt [-option] addr,其中module选项在存在同名全局变量与局部变量时使用,若不加则显示局部变量,addr默认为虚拟内存地址,可以使用-p指示物理内存,name可以使用通配符来显示所有匹配项
- e* 写入指定内存,标准:e* address data
- ea,写入ASCII字符串(无NULL)
- eza,写入ASCII字符串(有NULL)
- eb,写入byte,多个数值需要用空格分开
- ed,写入dword
- r 寄存器操作,显示所有寄存器的值
- r zf 显示标志位
- r eax 显示寄存器eax
- r eax=0,对寄存器进行赋值
- k 堆栈操作
- k,显示函数调用关系(只显示call压入栈的返回地址)
- kb,显示函数调用关系以及每个函数的前三个参数
- kd,显示原始格式的栈(DWORD),不加以处理
- u 反汇编操作
- u address 显示指定地址的反汇编,地址必须为一条指令开始,否则会导致指令从该地址开始被解析(类似花指令效果)
- uf address 显示指定地址所在函数的反汇编,不要求地址为精确的函数开始地址