













来源 https://mp.weixin.qq.com/s/fMMlsWAuCOra3Q583Yhd3A
WinDbg 的常用命令其实就覆盖几类操作:控制程序执行、查看内存、设置断点、检查堆栈。把这些命令理顺了,日常调试就能顺手很多。下面按功能分类把常用命令过一遍,带上参数和典型用法,方便随时查阅。


一、流程控制
g:Go,让程序跑起来。p:单步步进(对应 F10);p 2 连走两步。pa 地址:单步执行到指定地址停下,比如 pa 0x7c801b0b。pc:单步执行到下一个函数调用处停下。
q:结束调试会话——会结束进程,但不退出 Windbg。qd:脱离调试会话——不结束进程,也不退出 Windbg。.restart:重启目标进程。.reboot:重启调试系统,内核调试里用。


二、内存读写
显示按宽度选命令:db 按字节,dw 单字(2 字节),dd 双字(4 字节),dq 四字(8 字节);da 按 ASCII,du 按 UNICODE;df / dD 分别是单精度、双精度浮点。
写入对应:eb / ew / ed / eq,以及 ea / eu / ef / eD。注意:ea、eu 写字符串不会自动在结尾填 '\0';eza、ezu 会自动填充空终止符——改字符串时别搞反。!db 等带感叹号的,按物理地址显示,其他内存操作同理。
dds / dqs:按双字或四字显示一段内存,并假定这些是符号表地址,顺带打出符号。dt _eprocess:看 EPROCESS 成员;dt _eprocess 0x510:从地址按该结构解析;dt ntdll!*、dt ntdll!_peb*:通配符列类型。


三、寄存器与页表
r:显示所有寄存器,以及发生 core 所在指令。r eax, gdtr:只看指定寄存器。r eax=5, edx=6:给寄存器赋值。
!pte 虚拟地址:看当前进程(一般是系统进程)里该虚拟地址的页表、页目录信息。!vtop 页目录基址 虚拟地址:指定 cr3,再查该虚拟地址的页信息。


四、内存搜索
s 命令可指定模式:-b 字节,-w WORD,-d DWORD,-q QWORD。s -b 地址 L100 cc c2:从地址往后 100 字节找字节序列;L-100 表示往前找。s -b 地址 L100 'k' 'k':按 ASCII 码找;s -d 地址 L100 'H':按双字找 ASCII;s -a 地址 L100 "ntdll":找 ASCII 字符串。

五、硬件断点 ba
ba:break on access,也叫处理器断点、数据访问断点。访问类型:e——CPU 从该地址取指令时断下(类似软件断点,但不往代码里插断点指令);r——读或写该地址时断下;w——仅写入时断下;i——访问指定 I/O 端口时断下(仅内核模式、仅 x86)。
例子:ba r4 0x00401200:对从该地址起 4 字节区域读写时中断;ba w4 0x00401200:仅写时中断;ba i4 0x3f8:串口相关端口访问时断下(覆盖 0x3F8–0x3FB 一带)。

六、软件断点 bp / bu
bp:在指定地址设软件断点。若设置时地址表达式解析不了,会自动变成 bu;用 bp 建的断点,模块卸载后不再活动。bu:未解析 / 延迟断点,挂在符号引用上,模块解析出来后才激活。
bp main、bp 0x7c801b00:函数名或地址下断。内核模式:bp /p EProcess 对该进程(其下所有线程)下断;bp /t EThread 对指定线程下断。管理:bl 列出;bc * 全清;be * 全启用;bd * 全禁用;bc 1 2 5 清指定编号。

七、反汇编
u:反汇编当前 eip 往后约 8 条指令。u main.exe+0x10 L20:从该地址往后反汇编 20 条。ub 地址 L20:看该指令前面的 20 条。uf NtOpenProcess、uf demo::add:按函数整段反汇编。

八、堆栈
k:当前调用堆栈。kn:带栈帧编号。kb:打出前 3 个函数参数;kb 5 只显示最上 5 层。kv:在 kb 基础上加调用约定、FPO 等信息。kp:每一层完整参数(类型、名字、取值)。kd:打印堆栈地址。
.frame:当前栈帧;.frame n:看编号 n 的栈帧(n 为十六进制);.frame /r n:顺带显示寄存器变量;.frame /c n:把编号 n 设为当前栈帧。dv:显示当前栈帧的参数和局部变量。

九、进程与线程
!process -1 1:当前进程信息。!process 0nPID 0:按 PID 查,例如 !process 0n4 0。!process 0 0 进程名:按名查,例如 !process 0 0 x64.exe。!process EPROCESS地址:显示该进程关键信息(含所有线程)。
!peb、!peb 地址:看 PEB(先 .process 切到目标进程再看指定地址更靠谱)。!Token 地址:看 Token,里面是很多安全相关信息。.context:用户态当前进程上下文 / 页目录基址(物理地址)。.process:当前 EPROCESS;.process /p /i 地址:切到目标进程上下文;.process /p /r 地址:切换后再加载用户模式符号(效果类似 .reload /user)。.thread、.thread 地址:显示或切换到指定 ETHREAD。

十、模块与符号
lm:列出模块及符号信息;lm u / lm k:内核调试时只显示用户态或内核态符号。ld *、ld kernel32:为当前进程加载全部或指定模块符号。
.sympath:查看符号路径;.sympath c:\symbols:设为本地目录;.sympath SRV*本地缓存*http://msdl.microsoft.com/download/symbols:走微软符号服务器;.sympath+ 路径:追加路径。.reload:为所有已加载模块载入符号(所有进程);.reload /f 模块:强制立即加载;.reload /f /v:强制 + 详细输出。

十一、表达式与格式
.formats 表达式:在当前线程/进程上下文里计算,并按十六进制、十进制、八进制、二进制、字符、时间、浮点等多种格式显示。? 表达式:计算并显示值;0y 开头表示二进制,0t 八进制,默认十进制,0x 十六进制。

十二、内核与对象杂项
ed kd_default_mask 0xffffffff:让 Windbg 输出更多调试信息。dg 选择子(如 dg 10、dg cs):看段描述符详情。!idt -a:列 IDT 全部项;!idt 3:看 3 号向量对应例程。!teb:当前线程 TEB;!thread 地址:简洁显示 ETHREAD。!pcr:当前 CPU 的 KPCR;dt nt!_KPCR 地址 -y IRQL:只看 IRQL 字段。
!apc、!apc proc EPROCESS:看 APC;!dpcs、dt _KDPC 地址:看 DPC。!alpc /lpp EPROCESS:列该进程 LPC 端口;!alpc /p 端口、!alpc /m 消息:看端口或消息详情。!handle 0:列当前进程句柄;!handle 句柄:看类型;!handle 0 6 Mutant:只显示互斥对象(文档里写作 !hanlde 的,实际命令是 !handle)。!object 地址:看对象类型。ln eip:与 eip 最近的符号;!address 地址:该地址内存信息。x nt!Dbg*:nt 里以 Dbg 开头的符号。


十三、总结
1. 跑起来用 g;单步 p / pa 到地址 / pc 到调用
2. q 结束进程不退 Windbg;qd 只脱离不杀进程
3. 内存显示 db/dw/dd/dq、da/du;写入 eb/ew/ed/eq
4. ea/eu 不自动补 '\0';eza/ezu 会补空终止符
5. dt 解析结构体;r 看/改寄存器;!pte / !vtop 查页表
6. s -b/-w/-d/-q/-a 搜内存;L100 往后,L-100 往前
7. ba:e执行 r读写 w写入 i端口;不改代码插断点
8. bp 软件断点;bu 延迟未解析断点;bl/bc/be/bd 管理
9. u/ub/uf 反汇编;k/kn/kb/kv/kp 看栈;.frame / dv 看栈帧变量
10. !process / !peb / !Token;.process / .thread 切上下文
11. lm / ld 管模块符号;.sympath + .reload 配符号路径
12. .formats / ? 做多进制换算;0y/0t/0x 前缀
13. !idt / !pcr / !teb / !apc / !dpcs 内核结构速查
14. !handle / !object 看句柄对象;!alpc 看 LPC
15. ln 找近邻符号;!address 看地址属性;x 通配列符号
16. bp /p EProcess、bp /t EThread 仅内核模式
17. .restart 重启目标进程;.reboot 内核调试重启系统
18. dds/dqs 按指针宽度显示并尝试匹配符号
19. .process /p /r 切换进程并重载用户符号
20. 调试信息过少时可 ed kd_default_mask 0xffffffff
========= End
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。