第二步,在被调试的windows系统(debuggee)中,使用NTSD调试CSRSS。NTSD是WinDbg软件包中包含的另一个调试工具,它支持命令行下工作,还支持通过内核调试会话将输入和输出定向到另一台机器上,我们正是利用这一功能来在第二台Windows(debugger)中控制NTSD实现对CSRSS的调试。NTSD支持复杂的命令行选项,对于我们的用途,其命令行应该为:
nstd -d -g -G -o -pd <CSRSS 进程ID>
-d表示将输入和输出(通过DbgPrint)定向到另一个WINDOWS中的WinDbg中;-g表示忽略被调试进程的初始断点,如果不加此开关,那么将NTSD附加到CSRSS进程的第一个breakin断点会导致被调试系统僵死;-Gg表示忽略进程终止时的最后一个断点;-o表示调试被调试进程启动的子进程;-pd表示调试器应该自动与被调试的进程分离;-p用来指定被调试进程的进程ID。注意WinDbg的帮助文件说CSRSS的进程ID总为-1,这对于windows2000和其后的windows都不再成立。不过因为NTSD提供了一个简洁的方法,只要使用一项就是调试CSRSS。所以在成功建立内核调试后,只要在被调试机上切换到WinDbg目录,然后输入NTSD--.
如果一切顺利,输入NTSD--后,在调试机上应该收到类似如下的信息,笔者使用的环境是两台机器安装的都是windows xp(sp1),WinDbg的版本为6.6.
***wait with pending attach
...
Executable search path is:
ModLoad:4a680000 4a684000 c

windows\system32\csrss.exe
ModLoad:77f500000 77f57000 c

windows\system32\ntdll.dll
ModLoad:75b400000 75b4a0000 c

windows\system32\csrsrv.dll
ModLoad:75b50000 75b5e000 c:\windows\system32\basesrv.dll
ModLoad:75b60000 75ba6000 c:\windows\system32\winsrv.dll
ModLoad:.......c:\windows\system32\user32.dll
ModLoad:.......c:\windows\system32\kernel32.dll
ModLoad:.......c:\windows\system32\gdi32.dll
ModLoad:........c:\windows\system32\advapi32.dll
ModLoad:.........c:\windows\system32\rpcrt4.dll
ModLoad:.........c:\windows\system32\sxs.dll