<格蠹汇编>_第25章_如何调试窗口大总管

神圣不可侵犯

         CSRSS进程,中文全称是系统服务进程,他监管着系统中运行的所有windows进程和线程。在消息分发,桌面管理,终端登录,控制台管理,DOS虚拟机等方面起着重要作用。由于其重要性,调试CSRSS进程也是相当困难的

特殊的调试方式

         尽管很重要,但是windows依然给我调试CSRSS进程的可能性。一共需要进行两部分操作。

         首先,需要修改windows全局标志来启用对CSRSS调试的支持,有两种方法修改全局标志,第一种是修改注册表HKLM\SYSTEM\CurrentControlSet\Control\Session Manager,将GlobalFlag的数值与0x20000或运算,并写入。第2种方法是在windbg目录执行gflags /r +20000,并在图形界面勾选“Enable debugging of Win32 Subsystem”.


         接下来是使用所谓的双机调试。我们一般使用两台计算机调试CSRSS,被调试机器不需要接收用户输入,没有用户界面,可以运行在后台,可以使用NTSD,调试主机使用windbg,以内核调试方式连接到被调试机器。

附加到CSRSS

         搭建好双机调试的环境后,在启用内核调试环境后,利用命令行的形式进入windbg目录下,执行NTSD --,可以看到控制台没有任何提示,但是NTSD在后台运行。

         然后在调试主机,以内核调试下的双机调试打开windbg,发现windbg已经附加在了CSRSS,只是CSRSS并没有中断下来,有一个方法是利用F12中断,当存在有页面的程序是,按F12可以使其中断在调试器。但是这样也好复杂。

         windbg下有个小工具就是干这件事的,将控制台切换到windbg目录,并且查找CSRSS的PID,然后 执行breakin PID即可中断在调试器。

符号文件

         当windbg中断后,利用lm罗列所有模块或者使用k命令查看栈回溯的话可能会得到一个warning,这是因为我们没有加载符号信息,但是我们应该加载被调试系统的符号还是加载调试系统的符号信息呢?之前说过调试端的调试器用于人机接口,被调试端的调试器起到真正的调试功能,所以,应该加载被调试的端的符号信息,执行.sympath c:\symbols1,然后.reload即可。

         有了符号信息后执行lm后显示模块信息,且没有warning

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0:011> lm
lm
start end module name
4a680000 4a685000 csrss (no symbols)
62c20000 62c29000 LPK (pdb symbols) c:\symbols1\lpk.pdb\4B6570DF2CFF45AAB60E416993385EAC1\lpk.pdb
73fa0000 7400b000 USP10 (pdb symbols) c:\symbols1\usp10.pdb\0F289BC0C9A94139BC1C31EDEDBF52311\usp10.pdb
75aa0000 75aab000 CSRSRV (export symbols) C:\WINDOWS\system32\CSRSRV.dll
75ab0000 75ac0000 basesrv (export symbols) C:\WINDOWS\system32\basesrv.dll
75e00000 75eae000 sxs (export symbols) C:\WINDOWS\system32\sxs.dll
764e0000 76534000 winsrv (export symbols) C:\WINDOWS\system32\winsrv.dll
77d10000 77da0000 USER32 (pdb symbols) c:\symbols1\user32.pdb\D18A41B74E7F458CAAAC1847E2D8BF022\user32.pdb
77da0000 77e49000 ADVAPI32 (pdb symbols) c:\symbols1\advapi32.pdb\5EFB9BF42CC64024AB64802E467394642\advapi32.pdb
77e50000 77ee2000 RPCRT4 (pdb symbols) c:\symbols1\rpcrt4.pdb\CCD4FE9B704E48B6B8A12F31E112AA6F2\rpcrt4.pdb
77ef0000 77f39000 GDI32 (pdb symbols) c:\symbols1\gdi32.pdb\740F60A99F2A417E96C387400994588D2\gdi32.pdb
77fc0000 77fd1000 Secur32 (pdb symbols) c:\symbols1\secur32.pdb\E8D378740B8E4A46B19CAFCD2D6DDF7D2\secur32.pdb
7c800000 7c91e000 KERNEL32 (pdb symbols) c:\symbols1\kernel32.pdb\34560E80F5C54175B208848EF863C5BD2\kernel32.pdb
7c920000 7c9b3000 ntdll (pdb symbols) c:\symbols1\ntdll.pdb\1751003260CA42598C0FB326585000ED2\ntdll.pdb

         使用x modulename!funcationname,查看符号信息。使用 ~*查看所有线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0:011> x winsrv!*
x winsrv!*
764e84eb winsrv!UserServerDllInitialization (<no parameter info>)
764e88c9 winsrv!ConServerDllInitialization (<no parameter info>)
764ec121 winsrv!UserSoundSentry (<no parameter info>)
764f4ba4 winsrv!UserTestTokenForInteractive (<no parameter info>)
0:011> ~*
~*
0 Id: 254.25c Suspend: 1 Teb: 7ffde000 Unfrozen
Priority: 2 Priority class: 32 Affinity: 1
1 Id: 254.260 Suspend: 1 Teb: 7ffdd000 Unfrozen
Start: winsrv!ConServerDllInitialization+0x35f4 (764ebebd)
Priority: 0 Priority class: 32 Affinity: 1
2 Id: 254.264 Suspend: 1 Teb: 7ffdc000 Unfrozen
Start: CSRSRV!CsrValidateMessageString+0x179 (75aa4616)
Priority: 0 Priority class: 32 Affinity: 1
3 Id: 254.268 Suspend: 1 Teb: 7ffdb000 Unfrozen
Start: CSRSRV!CsrUnhandledExceptionFilter+0x936 (75aa3b3a)
Priority: 0 Priority class: 32 Affinity: 1
4 Id: 254.274 Suspend: 1 Teb: 7ffda000 Unfrozen
Start: CSRSRV!CsrValidateMessageString+0x179 (75aa4616)
Priority: 0 Priority class: 32 Affinity: 1

后记

         利用这样NTSD和双机调试可以调试众多系统进程。例如wilogon.exe,CSRSS其实是服务器进程,其他进程是客户进程。进程内部有WINSRV,CSRSRV,BASESRV三个模块。