本文搜集了一些windbg常用的命令,方便自己查阅,老版本windbg现在已经集成在visual studio里面,新版本的直接在Microsoft Store里面可以搜到,不过新的windbg preview版本不是很稳定,不过UI挺友好的。下面的内容不定期补充,首先放一个官方对windbg命令介绍的地址
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/commands
符号
windbg里面下载微软符号都需要梯子,我是这样设置的1
2
3SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols
srv*C:\symbols_folder*http://msdl.microsoft.com/download/symbols
SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols
如果符号没加载出来可以!sym noisy
激活详细符号加载显示,然后再.reload
重新加载看什么问题
断点
下面记录一些常用断点命令
1.硬件断点,最多下四个断点
1 | ba e1 address |
2.软件断点
1 | bp address |
3.条件断点
对寄存器进行监控,eax 等于0x41的时候断下1
ba e1 address ".if @eax = 0x41 {} .else {gc}"
打印一些数据,当在address断下的时候可以打印函数名和rax寄存器里面的内容1
bp address ".echo function name; dq rax; gc"
如果需要指定当前线程中对函数下断点,可以用下面的例子指定当前线程1
ba e1 /t $thread xxx
修改数据
1.修改寄存器命令,将eax置为1,如果要修改浮点寄存器,需要按格式修改,如下所示
1 | r @eax=1 |
2.修改内存命令,将内存为80505648的数据改为00001234
1 | ed 80505648 00001234 |
进程操作
内核态
1.!process 0 0
显示进程列表
1 | 1: kd> !process 0 0 |
后面加xxx.exe可以指定进程1
2
3
4
51: kd> !process 0 0 smss.exe
PROCESS ffff868520d36400
SessionId: none Cid: 01a4 Peb: 2238d4d000 ParentCid: 0004
DirBase: 12a451002 ObjectTable: ffffc78ec3507480 HandleCount: 53.
Image: smss.exe
也可以根据PID直接搜索1
2
3
4
5
61: kd> !process 470 0
Searching for Process with Cid == 470
PROCESS ffff868523618340
SessionId: 0 Cid: 0470 Peb: d294a3d000 ParentCid: 02bc
DirBase: 1b824002 ObjectTable: ffffc78ec70f7b40 HandleCount: 657.
Image: svchost.exe
2.如果windbg正在调试内核,可以直接修改当前process调试ring3的进程,.process
命令指定要用作进程上下文的进程,直接使用.process
可显示当前进程的EPROCESS
,下面展示了一次切换进程上下文的例子,将0xffff86851c08a300
切换为了ffff868520f77080
,这样就可以直接调ring3的进程,不过需要重新g
跑一下
1 | 1: kd> .process |
- 可以通过
!dml_proc
命令直接查看所有进程,非常方便1
2
3
4
5
61: kd> !dml_proc
Address PID Image file name
ffff8685`1c08a300 4 System
ffff8685`1c12e080 a0 Registry
ffff8685`20d36400 1a4 smss.exe
...
用户态
1.~
显示所有线程简略信息, ~*
显示所有线程详细信息,最左边有小点的就是当前线程
1 | 0:008> ~ |
显示当前线程
1 | 0:008> ~. |
查看数据
查看句柄
可以通过!handle
命令查看当前进程所有句柄,需要在内核调试器下才能看句柄信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
191: kd> !handle
PROCESS ffff868523618340
SessionId: 0 Cid: 0470 Peb: d294a3d000 ParentCid: 02bc
DirBase: 1b824002 ObjectTable: ffffc78ec70f7b40 HandleCount: 657.
Image: svchost.exe
Handle table at ffffc78ec70f7b40 with 657 entries in use
0004: Object: ffff868521fda960 GrantedAccess: 001f0003 (Protected) (Inherit) Entry: ffffc78ec72a1010
Object: ffff868521fda960 Type: (ffff86851c0a87a0) Event
ObjectHeader: ffff868521fda930 (new version)
HandleCount: 1 PointerCount: 32767
0008: Object: ffff868521fda3e0 GrantedAccess: 001f0003 (Protected) (Inherit) Entry: ffffc78ec72a1020
Object: ffff868521fda3e0 Type: (ffff86851c0a87a0) Event
ObjectHeader: ffff868521fda3b0 (new version)
HandleCount: 1 PointerCount: 32718
...
加上/f
选项即可查看句柄详细信息,此功能大多用在查看驱动设备名1
2
3
4
5
6
7
8
9
10
11
12
131: kd> !handle 0xa0 /f
PROCESS ffff868523618340
SessionId: 0 Cid: 0470 Peb: d294a3d000 ParentCid: 02bc
DirBase: 1b824002 ObjectTable: ffffc78ec70f7b40 HandleCount: 657.
Image: svchost.exe
Handle table at ffffc78ec70f7b40 with 657 entries in use
00a0: Object: ffff868523605b80 GrantedAccess: 00000804 (Protected) (Audit) Entry: ffffc78ec72a1280
Object: ffff868523605b80 Type: (ffff86851c1f56c0) EtwRegistration
ObjectHeader: ffff868523605b50 (new version)
HandleCount: 1 PointerCount: 1
2.查看浮点寄存器,如果直接用 r xmm0
查看寄存器会是科学计数,用下面指令就很方便了
1 | 0: kd> .formats xmm0 |
插件
chain
可以查看Windbg此时已经加载的插件
1 | 0:000> .chain |
.load
可以加载插件,需要指定全部路径,下面是例子
1 | 0:000> .load E:\..\segmentheap.dll |