cc682/NetRoc
http://netroc682.spaces.live.com/
KD连接服务器(内核模式)
通过KD连接服务器进行的内核模式调试需要在服务器上运行一个称为KD连接服务器的小程序。然后再客户端启动内核模式调试器。由于该客户端会处理所有实际操作,所以称为灵巧客户端。
Windows调试工具包中包含一个称为KdSrv (kdsrv.exe)的KD连接服务器。
两台计算机不需要运行相同版本的Windows;他们可以运行Windows NT、Windows 2000或之后版本的Windows。但是,客户端上使用的调试器和服务器上使用的KdSrv的二进制文件必须来自同一个Windows调试工具包版本。该方法不能用来调试dump文件。
要设置该远程会话,首先启动KD连接服务器,然后再激活灵巧客户端。可以有任意多个灵巧客户端通过一个单独的KD连接服务器进行操作,但是他们每个必须连接到不同的内核调试会话中。
本节包含:
激活KD连接服务器
搜索KD连接服务器
激活灵巧客户端(内核模式)
KD 连接服务器示例
控制KD连接服务器会话
激活KD连接服务器
Windows调试工具包中包含的KD连接服务器称为KdSrv (kdsrv.exe)。
KdSrv 支持几种传输协议:命名管道(NPIPE)、TCP、COM端口、安全管道(SPIPS)和安全套接字层(SSL)。 SPIPE和SSL仅在Windows 2000和之后版本中支持。
KdSrv的命令行语法由采用的协议决定,可以使用下面一些:
kdsrv -t npipe:pipe=PipeName[,hidden][,password=Password]
kdsrv -t tcp:port=Socket[,hidden][,password=Password][,ipversion=6]
kdsrv -t tcp:port=Socket,clicon=Client[,password=Password][,ipversion=6]
kdsrv -t com:port=COMPort,baud=BaudRate,channel=COMChannel[,hidden][,password=Password]
kdsrv -t spipe:proto=Protocol,{certuser=Cert|machuser=Cert},pipe=PipeName[,hidden][,password=Password]
kdsrv -t ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket[,hidden][,password=Password]
kdsrv -t ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket,clicon=Client[,password=Password]
上面命令的参数有下面一些可能的值:
PipeName
当使用NPIPE或SPIPE协议时,PipeName 是用作管道名的字符串。每个管道名都应该标识一个唯一的进程服务器。如果尝试重复使用管道名,会收到一条错误信息。PipeName 不能包含空格或引号。PipeName 可以包含数字的printf 形式格式化代码,例如%x 或%d。进程服务器会将它替换为KdSrv的进程ID。第二个这样的代码会被替换为KdSrv的线程ID。
Socket
当使用TCP或SSL时,Socket 是套接字的端口号。也可以用一个冒号来指定端口范围(例如port=2:7)。KdSrv会检查该范围内的端口是否可用。如果找到了一个空闲端口并且没有出现错误,KD连接服务器会被创建起来。灵巧客户端需要指定连接到服务器的实际端口号。 (如果使用了clicon参数来进行反向连接,灵巧客户端也可以按这种方式指定端口范围,而KD连接服务器必须指定实际使用的端口。)
clicon=Client
使用TCP或SSL协议并指定clicon 参数时,会打开反向连接。这意味着KD连接服务器会试图连接灵巧客户端,而不是由客户端来发起连接。这在当防火墙阻止通常方向上的连接时会比较有效。客户端指定灵巧客户端所在的计算机的网络名或IP地址。两个反斜杠(\\)是可选的。
因为使用进程服务器来寻找特定客户端的方式,所以不能将多个客户端连接到一个服务器。如果连接被拒绝或丢失,必须重起进程服务器。当使用-QR命令显示所有活动服务器时,反向连接的服务器不会被列举出来。
注意 使用clicon时,最好在KD连接服务器创建之前启动灵巧客户端,但是正常的顺序(服务器在客户端之前)也可以使用。
COMPort
使用COM协议时,COMPort 指定使用的COM端口。前缀"COM"是可选的—例如,"com2" 和"2"都可以使用。
BaudRate
使用COM协议时,BaudRate 指定连接使用的波特率。硬件所支持的所有波特率都可以使用。
COMChannel
如果使用COM协议,COMChannel 指定和调试客户端通信所使用的COM频道。它可以是0到254之间的任意值(包含0和254)。单个COM端口可以通过使用不同的频道号来支持多个连接。 (这和调试电缆使用COM的情况不同—那种情况下COM端口不能使用频道。)
Protocol
(Windows 2000 和之后的系统) 如果使用SSL或SPIPE,Protocol 指定安全频道(S-Channel)协议。它可以是tls1、pct1、ssl2或ssl3。
Cert
(Windows 2000和之后的系统) 如果使用SSL或SPIPE协议,Cert 用于指定证书。它可以是证书名或证书的特征码(由证书管理机构提供的16进制数字字符串)。如果使用certuser=Cert 形式的语法,调试器会在系统存储中查找证书(默认存储位置)。如果使用machuser=Cert 的语法,调试器在机器存储中查找证书。指定的证书必须支持服务器验证。
hidden
避免KD连接服务器在有人使用-QR命令行选项显示所有活动服务器时被显示出来。
password=Password
要求灵巧客户端在连接到KD连接服务器时提供指定的密码。Password 可以是任何字母和数字组成的字符串。
注意 在TCP、NPIPE或COM协议下使用密码仅提供低程度的保护,因为密码不会被加密。当密码和SSL或SPIPE协议一起使用时,会被加密。如果需要安全的远程会话,必须使用SSL或SPIPE协议!
ipversion=6
(仅Debugging Tools for Windows 6.6.07 和更老的版本) 用TCP连接到Internet时强制调试器使用IPV6而不是V4。在Windows Vista和之后版本中,调试器会尝试默认使用IP v6
,所以没有必要使用该选项。
搜索KD连接服务器
可以用KD、CDB和-QR命令行选项来获得某个网络服务器上运行的所有可用的KD连接服务器列表。
这个列表中可能包含已经不存在但是没有被完全关闭的服务器—连接到这样的服务器会产生一条错误信息。该列表也包含调试服务器和用户模式进程服务器。每种情况下的服务器类型都会被指明。
使用语法如下:
Debugger -QR \\Server
Debugger 可以是KD或CDB—两种情况下输出都一样。反斜杠(\\)开头的Server是可选的。
在WinDbg中,可以使用Connect to Remote Stub Server对话框来查看可用的KD连接服务器列表。
对于每个KD连接服务器都会按照用于启动调试客户端的完整的连接字符串形式列出(除了密码会用星号替代之外) 。进程连接服务器也在该列表中。查看File | Connect to Remote Stub获得详细信息。
激活灵巧客户端(内核模式)
一旦KD连接服务器被激活,就可以在另外一台计算机上启动一个灵巧客户端开始调试会话。
有两种不同的启动灵巧客户端的方法:和内核协议kdsrv 一起启动KD或WinDbg,或者使用WinDbg图形界面。
需要指定KD连接服务器所使用的传输协议。也可以指定KD连接服务器和目标机实际的内核连接协议,或者使用默认值。
灵巧客户端使用的协议必须和进程服务器匹配。启动灵巧客户端的常规语法由使用的协议决定。有下面一些选择:
Debugger -k kdsrv:server=@{npipe:server=Server,pipe=PipeName[,password=Password]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{tcp:server=Server,port=Socket[,password=Password][,ipversion=6]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{tcp:clicon=Server,port=Socket[,password=Password][,ipversion=6]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{com:port=COMPort,baud=BaudRate,channel=COMChannel[,password=Password]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{spipe:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,pipe=PipeName[,password=Password]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{ssl:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,port=Socket[,password=Password]},trans=@{ConnectType} [Options]
Debugger -k kdsrv:server=@{ssl:proto=Protocol,{certuser=Cert|machuser=Cert},clicon=Server,port=Socket[,password=Password]},trans=@{ConnectType} [Options]
要使用图形界面连接到KD连接服务器,WinDbg必须在静止模式下—它必须以没有命令行参数的形式启动,或必须中止已有的调试会话。选择File | Connect to Remote Stub菜单命令。当Connect to Remote Stub Server 对话框出现后,在Connection string 文本框中输入下面的字符串之一:
npipe:server=Server,pipe=PipeName[,password=Password]
tcp:server=Server,port=Socket[,password=Password][,ipversion=6]
tcp:clicon=Server,port=Socket[,password=Password][,ipversion=6]
com:port=COMPort,baud=BaudRate,channel=COMChannel[,password=Password]
spipe:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,pipe=PipeName[,password=Password]
ssl:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,port=Socket[,password=Password]
ssl:proto=Protocol,{certuser=Cert|machuser=Cert},clicon=Server,port=Socket[,password=Password]
另外,也可以使用Browse 来定位激活的KD连接服务器。查看File | Connect to Remote Stub获取详细信息。
上面命令中的参数有下面一些可能的值:
Debugger
可以是KD或WinDbg。
Server
这是创建KD连接服务器的计算机的网络名字或IP地址。两个反斜杠(\\) 在命令行中是可选的,但是在WinDbg对话框中不能使用。
PipeName
如果使用NPIPE或SPIPE,PipeName 是KD连接服务器创建时设定的管道名。
Socket
如果使用TCP或SSL协议,Socket 和KD连接服务器创建时指定的套接字端口号一样。
clicon
指定KD连接服务器将试图通过反向连接来连接到灵巧客户端。客户端当且仅当服务器也使用clicon时才能使用clicon。大多数情况下,使用反向连接时,灵巧客户端应比KD连接服务器先启动。
COMPort
如果使用COM协议,COMPort 指定使用的COM端口。前缀"COM"是可选的—例如, "com2" 和"2"都可以使用。
BaudRate
如果使用COM协议,BaudRate 必须和KD连接服务器创建时选择的波特率匹配。
COMChannel
如果使用COM协议,COMChannel 必须和KD连接服务器创建时选择的频道号匹配。
Protocol
(Windows 2000 和之后的系统) 如果使用SSL或SPIPE协议,Protocol 必须和KD连接服务器创建时选择的安全协议匹配。
Cert
(Windows 2000 和之后的系统) 如果使用SSL或SPIPE协议,必须和KD连接服务器创建时指定一样的certuser=Cert 或machuser=Cert 参数。
Password
如果KD连接服务器创建时使用了密码,创建灵巧客户端时必须使用Password 。它必须和原始密码匹配。密码是大小心敏感的。如果密码错误,会出现"Error 0x80004005." 错误。
ipversion=6
(仅Debugging Tools for Windows 6.6.07 和之前的版本) 强制调试器在使用TCP连接到Internet时使用IP v6而不是v4。在Windows Vista和之后的版本中,调试器尝试默认使用IP v6,所以不再需要该选项。
ConnectType
用于告诉调试器如何连接到目标机。支持下面这些内核连接协议:
com:port=ComPort,baud=BaudRate
1394:channel=1394Channel[,symlink=1394Protocol]
usb2:targetname=String
com:pipe,port=\\VMHost\pipe\PipeName[,resets=0][,reconnect]
com:modem
关于这些协议的信息,查看选择内核调试设置。可以省略这些协议中任意一个参数——例如,可以设置 trans=@{com:} ——调试器会默认将这些值设置为KdSrv运行的计算机上的环境变量中指定的值。
Options
任何其它命令行参数都可以放在这里。查看命令行选项获得完整列表。
由于KD连接服务器类似于灵巧客户端的网关一样工作,其他的选项和在KdSrv所运行的计算机上启动内核调试器所使用的一样。不同之处在于,任何指定路径或文件名的选项都应该使用灵巧客户端所在计算机上的路径。
KD连接服务器示例
假设调试技术人员和被调试的计算机不在同一个地方。技术人员请在机器旁边的其他人将目标机和另一台计算机用调试电缆连接起来。
假设另一台计算机的IP地址是127.0.0.42。调试电缆将该计算机的COM1接口和目标机的调试端口连接起来。KD连接服务器使用下面的命令启动:
E:\Debugging Tools for Windows> kdsrv -t tcp:port=1027
然后在另一边,技术人员使用下面的命令将WinDbg作为灵巧客户端启动起来:
G:\Debugging Tools> windbg -k kdsrv:server=@{tcp:server=127.0.0.42,port=1027},trans=@{com:port=com1,baud=57600} -y SymbolPath
符号路径和灵巧客户端运行的计算机关联。
这里有另外一个例子。该示例中,选择使用NPIPE协议,调试器使用KD而不是WinDbg。第一个用户选择了管道名。可以是任意字母或和数字组成的字符串——本例中为"KernelPipe"。
E:\Debugging Tools for Windows> set _NT_DEBUG_PORT=com1
E:\Debugging Tools for Windows> kdsrv -t npipe:pipe=KernelPipe
技术人员不清楚所使用的名字,所以他/她在网络上查询管道名:
G:\Debugging Tools> cdb -QR 127.0.0.42
Servers on 127.0.0.42:
Debugger Server - npipe:Pipe=MainPipe
Remote Process Server - npipe:Pipe=AnotherPipe
Remote Kernel Debugger Server - npipe:Pipe=KernelPipe
显示出了三个管道。但是,只有一个是KD连接服务器——其他是调试服务器和用户模式进程服务器。所以可以用下面的命令来启动灵巧客户端:
G:\Debugging Tools> kd -k kdsrv:server=@{npipe:server=127.0.0.42,pipe=KernelPipe},trans=@{com:baud=57600} -y SymbolPath
注意,虽然设置了波特率,但是没有设置端口。这使得调试器默认使用由KdSrv运行的机器上的_NT_DEBUG_PORT 环境变量指定的端口。
控制KD连接服务器会话
当远程会话开始之后,灵巧客户端就可以像在KD连接服务器上调试目标机一样。除了路径是按照灵巧客户端所在计算机设置之外,所有命令也按同样的方式使用。
使用WinDbg作为灵巧客户端
当WinDbg启动作为KD连接服务器的灵巧客户端之后,可以使用Debug | Stop Debugging命令来结束调试会话。这时,WinDbg会进入静止模式并且不再连接到KD连接服务器。所有之后的调试都在WinDbg运行的计算机上进行。不能使用File | Kernel Debug 重新连接到KD连接服务器上——只能通过命令行来连接。
结束调试会话
KD或WinDBg可以使用常规办法退出或结束调试会话。查看结束调试会话获得详细信息。KD连接服务器会继续存在并可以被使用任意多次。 (也可以同时被任意多个调试会话使用。)
在每一方的计算机上都可以终止KD连接服务器。使用.endpsrv (End Process Server) 命令从灵巧客户端终止它。在KD连接服务器所在的计算机上,可以使用进程管理器终止kdsrv.exe进程。
如果希望KD连接服务器自己结束,可以使用任务管理器(Task Manager)结束它,或者在灵巧客户端使用.endpsrv (End Process Server) 命令。