LYYL' Blog

勿忧拂意,勿喜快心,勿恃久安,勿惮初难。

0%

windbg教程

安装

有两种方式可以进行安装,一种是直接在微软的应用商店中搜索windbg preview进行安装下载,另一种是通过安装win10 SDK中的debugging tools进行安装。我是采用第二种方式进行安装的,因为第一种方式下载安装的windbg preview无法运行。

下载下来之后运行选择Debugging Tools for Windows下载完成之后到一开始选择的目录下面寻找安装文件,安装即可。

安装symbols

  1. windbg的安装目录加入到环境变量中方便程序寻找SYMSRV.DLL, SYMSTORE.EXE文件

  2. 新建环境变量_NT_SYMBOL_PATH,其值设置为SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols,或者查看windbg的项目地址获取服务器的地址

    前面的设置的文件夹是用来存储下载的符号文件的,也可以将值设置为cache*c:\mysymbol;srv*http://msdl.microsoft.com/download/symbols

attach一个进程,即可以在相应的文件夹下面看到下载的符号文件了

设置工作空间

windbg会保存每一个你调试的工程信息,类似于ida的项目文件。每个调试的工作空间的信息默认保存在HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces中,在这个键下一般有4个子键User、Kernel、Dump、Explicit, 他们分别保存用户态调试,内核态调试、转储文件调试、以及手动保存(Save Workspace As)的工作空间信息。

若发现没有相应的子键则说明还没有使用过相应的调试方式。

命令注解

文档

  • a表示ASCII码
  • b表示字节和ASCII码
  • c表示DWORD和ASCII码
  • d表示DWORD
  • D表示双精度浮点数
  • f表示单精度浮点数
  • p表示按指针宽度显示
  • q表示四字(8字节)
  • u表示UNICODE字符
  • w表示字
  • W表示字和ASCII码
  • yb表示二进制和字节
  • yd表示二进制和双字
命令 含义
g {address} 运行/运行到指定地址
gu 执行到从当前函数返回
t, tb 步入, 追踪到下一条分支指令
p 步过
pc 代码运行至下一个子例程调用处
wt 和p类似,可以获取被调用函数的一些信息(如被调用了几次,执行了多少指令等)
r 查看和修改寄存器
rm 查看和修改寄存器掩码,用来查看XMM或者MMX寄存器的值
u [start] [end] 反汇编代码
uf 反汇编当前$ip所在的函数
ub 反汇编当前$ip之前的指令
k/kp/kb/kf 显示函数栈帧/解析函数和参数类型/显示前三个函数参数/显示函数只用栈的大小
d{a|b|c|d|D|f|p|q|u|w|W|yd|yb} 查看内存
d{d|q|p}s 将内存中的一个元素(d表示四字节|q表示八字节|p表示根据架构选择)作为一个符号进行解析。用来查看栈
d*u 同上,以Unicode解释内存中的一个元素
s 搜索内存 s -d 0x0 l?0x7fffffff 0x1a2c3b4d 全局搜索0x1a2c3b4d值
bp/bu 设置断点/设置延迟解析的断点
ba {r|w}{1|2|4} 设置内存断点(访问|写入)(1字节|2字节|4字节)
b{d|e|c} 禁用/启用/清除断点
bm 批量设置断点
bp <address> “cmd” 条件断点设置/断点后执行的命令bp JP2KLib+50567 “r eax; r ecx; .if(ecx>=fd){}.else{g;};”
dv { |/i|/V} 显示局部变量|显示符合类型和参数类型|显示变量存储位置
dt {struct} address 以struct结构查看数据/内存
!address 查看指定的地址是栈内存还是堆内存,如果未指定地址则枚举所有内存区域
!peb/!teb 获取进程的PEB和线程的TEB
!gle 显示错误码和格式化字符串
.cxr <content address> 重新指定上下文
e{d|b} 修改全局变量/修改当前执行的代码
!error 根据错误码查找错误信息
poi(address) 获取address指向内存的内容
? 计算表达式
.formats <data> data进行格式转换(显示所有的格式)