【调试技术】分析实战

概述: windbg 分析实战,命令输出解析、自定义脚本

[toc]

【输出分析】调试进程

双机调试下,调试进程要用到 !process.process 命令,进入进程空间后,命令同用户态调试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
1: kd> !process fffffa800c5c8060 3
PROCESS fffffa800c5c8060
SessionId: 0 Cid: 06fc Peb: 7fffffd4000 ParentCid: 025c
DirBase: 1f8dfb000 ObjectTable: fffff8a0020a44e0 HandleCount: 281.
Image: svchost.exe
VadRoot fffffa800c5c8570 Vads 128 Clone 0 Private 2532. Modified 992. Locked 0.
DeviceMap fffff8a001b400b0
Token fffff8a0020ac060
ElapsedTime 00:06:27.486
UserTime 00:00:00.046
KernelTime 00:00:00.093
QuotaPoolUsage[PagedPool] 94704
QuotaPoolUsage[NonPagedPool] 32760
Working Set Sizes (now,min,max) (4303, 50, 345) (17212KB, 200KB, 1380KB)
PeakWorkingSetSize 4717
VirtualSize 57 Mb
PeakVirtualSize 57 Mb
PageFaultCount 6769
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 2766

THREAD fffffa800c5d0060 Cid 06fc.0700 Teb: 000007fffffde000 Win32Thread: fffff900c075cc10 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800c3d96a0 SynchronizationEvent

THREAD fffffa800c482060 Cid 06fc.0704 Teb: 000007fffffdc000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Alertable
fffffa800c471060 SynchronizationTimer
fffffa800c42d200 SynchronizationTimer
fffffa800c467680 SynchronizationEvent
fffffa800c48b440 SynchronizationEvent
fffffa800c47f1f0 SynchronizationEvent
fffffa800c534060 SynchronizationEvent
fffffa800c556060 SynchronizationEvent
fffffa800c5212f0 SynchronizationEvent
fffffa800c5213f0 SynchronizationEvent
fffffa800c41f5d0 SynchronizationTimer
fffffa800c4595d0 SynchronizationTimer
fffffa800c592240 SynchronizationEvent
fffffa800c593b00 ProcessObject
fffffa800c459550 SynchronizationEvent
fffffa800c59b400 SynchronizationEvent
fffffa800c3f6810 SynchronizationEvent
fffffa800c5a1120 SynchronizationEvent
fffffa800c5b5120 SynchronizationEvent
fffffa800c482610 SynchronizationTimer
fffffa800c466060 SynchronizationEvent
fffffa800c59b060 SynchronizationEvent
fffffa800c3ec2d0 SynchronizationEvent
fffffa800c466240 SynchronizationEvent

THREAD fffffa800c4ad370 Cid 06fc.0708 Teb: 000007fffffda000 Win32Thread: fffff900c07cac10 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800cbdf3e0 SynchronizationEvent

THREAD fffffa800c4a2060 Cid 06fc.0714 Teb: 000007fffff9e000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800c4a9110 NotificationEvent

THREAD fffffa800c537370 Cid 06fc.0718 Teb: 000007fffff9c000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa80075eb840 NotificationEvent

THREAD fffffa800c54c370 Cid 06fc.0724 Teb: 000007fffff9a000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800c556140 NotificationEvent

THREAD fffffa800c54a060 Cid 06fc.072c Teb: 000007fffffd6000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800c5386b0 SynchronizationEvent
fffffa800c521370 NotificationEvent
fffffa800c521140 NotificationEvent
fffffa800c54a5b0 NotificationEvent
fffffa800c543760 NotificationEvent

THREAD fffffa800c51e060 Cid 06fc.0734 Teb: 000007fffff96000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800b2f8600 SynchronizationEvent
fffffa800c5341d0 SynchronizationEvent
fffffa800c556620 SynchronizationEvent
fffffa800c583780 SynchronizationEvent
fffffa800c5ce280 SynchronizationEvent
fffffa800cbcf660 SynchronizationEvent

THREAD fffffa800c41e380 Cid 06fc.0754 Teb: 000007fffff94000 Win32Thread: 0000000000000000 WAIT: (WrLpcReply) UserMode Non-Alertable
fffffa800c41e748 Semaphore Limit 0x1

THREAD fffffa800c41f060 Cid 06fc.075c Teb: 000007fffff90000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c5b53c0 QueueObject

THREAD fffffa800c466300 Cid 06fc.0760 Teb: 000007fffff8e000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Alertable
fffffa800c3ec060 SynchronizationEvent

THREAD fffffa800c461060 Cid 06fc.0764 Teb: 000007fffff8c000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800c41f790 SynchronizationEvent
fffffa800c41f810 NotificationEvent

THREAD fffffa8007c92060 Cid 06fc.00a0 Teb: 000007fffffd8000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c3d9500 QueueObject

THREAD fffffa800780e640 Cid 06fc.19f0 Teb: 000007fffff98000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c3d9500 QueueObject

THREAD fffffa80078fe650 Cid 06fc.1010 Teb: 000007fffff92000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c3d9500 QueueObject

THREAD fffffa8007ebdb50 Cid 06fc.12e4 Teb: 000007fffff8a000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
fffffa800d8a88c0 SynchronizationEvent

THREAD fffffa8008228b50 Cid 06fc.0e3c Teb: 000007fffff88000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c3d9500 QueueObject

THREAD fffffa8007800b50 Cid 06fc.0440 Teb: 000007fffff86000 Win32Thread: 0000000000000000 WAIT: (WrQueue) UserMode Alertable
fffffa800c3d9500 QueueObject

这是Windows Debugger(WinDbg)中!process命令的输出,提供了关于特定进程的信息。

  • 第一行显示了进程的ID,即fffffa800c5c8060

  • 第二行显示了进程的会话ID,即0

  • 第三行显示了调用进程的ID,即025c

  • 第四行显示了进程在内存中的基地址,即1f8dfb000

  • 第五行显示了进程的对象表,即ffff8a0020a44e0

  • 第六行显示了进程的句柄数,即281
    第七行显示了进程的图像,即svchost.exe

  • 第八行显示了进程的虚拟地址根,即ffffa800c5c8570

  • 第九行显示了进程中的VAD(虚拟地址目录)数,即128

  • 第十行显示了进程是否为克隆进程,即0

  • 第十一行显示了进程是否为私有进程,即2532

  • 第十二行显示了进程的修改计数,即992

  • 第十三行显示了进程的锁定计数,即0

  • 第十四行显示了进程的设备映射,即ffff8a001b400b0

  • 第十五行显示了进程的令牌,即ffff8a0020ac060

  • 第十六行显示了进程的运行时间,即00:06:27.486

  • 第十七行显示了进程的用户时间,即00:00:00.046

  • 第十八行显示了进程的内核时间,即00:00:00.093

  • 第十九行显示了进程的配额池使用情况,即94704用于页面池和32760用于非页面池。

  • 第二十行显示了进程的工作集大小,即4303用于现在、50用于最小和345用于最大。

  • 第二十一行显示了进程的峰值工作集大小,即4717

  • 第二十二行显示了进程的虚拟大小,即57 MB

  • 第二十三行显示了进程的峰值虚拟大小,也是57 MB

  • 第二十四行显示了进程的页面故障次数,即6769

  • 第二十五行显示了进程的内存优先级,即BACKGROUND

  • 第二十六行显示了进程的基本优先级,即8

  • 第二十七行显示了进程的提交量,即2766

  • 最后一部分输出显示了进程的线程。每个线程都用一行表示,包括线程ID、Cid(连接ID)、Teb(线程环境块)和等待类型和等待的对象。

  1. 查看某个进程

    1
    2
    3
    4
    # 查看某个进程
    !process 0 0 目标进程名 获取目标进程EPROCESS基本信息
    # 例如查看 svchost.exe
    !process 0 0 svchost.exe
  2. .process /p +EPROCESS信息 切换到目标进程空间

    1
    .process /p 进程地址
  3. .reload /f /user 强制重新加载用户态符号

    1
    .reload /f /user
  4. .process /i /p 目标进程的EPROCESS 侵入式调试

    1
    .process /i /p 进程地址
  5. bp 目标API 执行下断点命令

【脚本】遍历大小固定的结构体

如下所示 00007ffdf4044028 地址存放的是一个 _UNICODE_STRING* 的指针, _UNICODE_STRING 的大小为 0x10。

1
2
3
4
5
.for (r $t0=0;@$t0<3;r $t0=@$t0+1){ r $t1=$t0*0x10; dS 00007ffd`f4044028+$t1 } 

# 如果不知道结构体大小是多少,可以使用??命令计算
> ??sizeof(nt!_UNICODE_STRING)
unsigned int64 0x10

运行结果如下所示,打印了三个字符串。

image-20231129123908261

【调试技术】分析实战
https://hodlyounger.github.io/wiki/调试技术/【调试技术】分析实战/
作者
mingming
发布于
2024年8月31日
许可协议