前言

本系列针对的是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 内存访问断点
    • 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 显示指定地址所在函数的反汇编,不要求地址为精确的函数开始地址
10-03 17:12