神圣不可侵犯
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
使用x modulename!funcationname,查看符号信息。使用 ~*查看所有线程
后记
利用这样NTSD和双机调试可以调试众多系统进程。例如wilogon.exe,CSRSS其实是服务器进程,其他进程是客户进程。进程内部有WINSRV,CSRSRV,BASESRV三个模块。