cc682/NetRoc
http://netroc682.spaces.live.com/
转发器
转发器是在一台计算机上运行的轻量级的代理服务器,用于在其他两台机器之间转发数据。转发器不会对数据进行任何处理。其他两台机器几乎不知道转发器的存在,从他们的角度来看就像直接和对方通信一样。
另外两台机器上运行的进程称为服务器和客户端。从转发器的角度来看,他们之间并没有根本的不同点,只是服务器首先启动,然后启动转发器,最后才启动客户端。
Windows调试工具包包含的转发器称为DbEngPrx (dbengprx.exe)。
本节包含:
激活转发器
使用转发器
转发器示例
激活转发器
要激活转发器连接,一般来说要先启动服务器,然后启动转发器,最后启动客户端。
也可以先启动转发器然后再启动服务器。但是除非使用了clicon ,否则客户端总是最后一个启动的。
第一步:启动服务器
服务器可以是一个调试服务器、一个进程服务器或者KD连接服务器。可以按照常规的办法启动,只是通信协议设置为和转发器连接而不是客户端。详细信息查看激活调试服务器、激活进程服务器或激活KD连接服务器。
如果创建服务器时使用了密码,该密码在客户端附加时才需要,而不是转发器创建时。
如果使用了hidden参数,服务器和平常一样也会被隐藏。转发器本身总是被隐藏的。
第二步:启动转发器
Windows调试工具包中包含的转发器称为DbEngPrx (dbengprx.exe)。
DbEngPrx可以使用这些传输协议:命名管道(NPIPe)、TCP和COM端口。
如果客户端和服务器使用安全套接字层(SSL),使用TCP协议来和转发器连接。如果客户端和服务器使用安全管道(SPIPE)协议,使用NPIPE和转发器连接。转发器会直接转发任何收到的数据——不会解析、加密或解密任何信息。所有的加解密都会由客户端和服务器来完成。
DbEnPrx 命令行语法如下:
dbengprx [-p] -c ClientTransport -s ServerTransport
上面命令的参数有以下可能值:
-p
使得DbEngPrx 在所有连接丢失之后仍然运行。
ClientTransport
指定和服务器之间的协议设置。该协议需要和服务器创建时指定的一样。协议语法如下:
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]
协议参数有以下这些:
Server
这是服务器创建的机器的网络名或IP地址。开头的两个反斜杠(\\)是可选的。
PipeName
如果使用NPIPE或SPIPE协议,PipeName是服务器创建时指定的管道名。
Socket
如果使用TCP或SSL协议,Socket是服务器创建时指定的套接字端口号。
clicon
指定服务器由反向连接来连接到转发器。ClientTransport 当且仅当服务器使用clicon时才能使用clicon。大多数时候,使用反向连接时转发器要比服务器先启动。
COMPort
使用COM协议时,COMPort 指定使用的COM端口。前缀"COM"是可选的——例如, "com2" 和"2"都可以使用。
BaudRate
使用COM协议时,BaudRate 要和服务器创建时指定的波特率匹配。
COMChannel
使用COM协议时,COMChannel 要和服务器创建时指定的频道号匹配。
Password
如果服务器创建时使用了密码,在创建客户端时必须指定 Password。它必须和原始密码匹配。密码是区分大小写的。如果提供了错误的密码,会提示错误信息"Error 0x80004005."
ipversion=6
(仅Debugging Tools for Windows 6.6.07 和更老的版本) 用TCP连接到Internet时强制调试器使用IPV6而不是V4。在Windows Vista和之后版本中,调试器会尝试默认使用IP v6
,所以没有必要使用该选项。
ServerTransport
指定客户端连接转发器是使用的协议。可用的协议语法如下:
npipe:pipe=PipeName[,hidden][,password=Password]
tcp:port=Socket[,hidden][,password=Password]
tcp:port=Socket,clicon=Client[,password=Password]
com:port=COMPort,baud=BaudRate,channel=COMChannel[,hidden][,password=Password]
The protocol parameters have the following meanings:
PipeName
如果使用NPIPE或SPIPE协议,PipeName 是管道名的字符串。每个管道名都应该标识一个唯一的转发器。如果试图重用管道名,会收到一条错误消息。PipeName 不能包含空格或引号。PipeName 可以包含printf 形式的数字格式化代码,如%x 或%d。转发器用DbEngPrx 的进程ID来替代它,第二个格式化代码用DbEngPrx 的线程ID替代。
Socket
使用TCP或SSL协议时,Socket 是套接字端口号。也可以用一个冒号来指定端口范围(例如port=2:7)。转发器会检查该范围内的端口是否可用。如果找到了一个空闲端口并且没有出现错误,转发器连接服务器会被创建起来。客户端需要指定连接到转发器的实际端口号。 (如果使用了clicon参数来进行反向连接,客户端也可以按这种方式指定端口范围,而转发器连接服务器必须指定实际使用的端口。)
clicon=Client
使用TCP或SSL协议并指定clicon参数时,会打开反向连接。这意味着转发器会试图连接客户端,而不是由客户端来发起连接。这在当防火墙阻止通常方向上的连接时会比较有效。客户端指定客户端所在的计算机的网络名或IP地址。两个反斜杠(\\)是可选的。
因为使用转发器来寻找特定客户端的方式,所以不能将多个客户端连接到一个转发器。如果连接被拒绝或丢失,必须重起转发器。
使用clicon 时,最好在转发器创建之前启动客户端,虽然常规顺序也可以使用(转发器在客户端之前)。
COMPort
使用COM协议时,COMPort 指定使用的COM端口。前缀"COM"是可选的—例如,"com2" 和"2"都可以使用。在ClientTransport 和ServerTransport 中不能使用相同的COM端口。
BaudRate
使用COM协议时,BaudRate 指定连接使用的波特率。硬件所支持的所有波特率都可以使用。如果在ClientTransport 和ServerTransport 中都使用COM协议,可以指定不同的波特率,但是客户端和服务器之间的连接速度会被较慢的一个限制。
COMChannel
如果使用COM协议,COMChannel 指定和调试客户端通信所使用的COM频道。它可以是0到254之间的任意值(包含0和254)。单个COM端口可以通过使用不同的频道号来支持多个连接。 (这和调试电缆使用COM的情况不同—那种情况下COM端口不能使用频道。)
hidden
避免服务器在有人使用-QR命令行选项显示所有活动服务器时被显示出来。
password=Password
要求客户端在连接到调试会话时提供指定的密码。Password 可以是任何字母和数字组成的字符串。
第三步:启动客户端
客户端可以是一个调试客户端或灵巧客户端——由服务器类型决定。详细信息,查看激活调试客户端、激活灵巧客户端或激活灵巧客户端(内核模式)。
如果服务器拒绝了连接(例如,密码错误),转发器和客户端都会被关闭。需要重起他们才能再次连接服务器。
使用转发器
转发器执行的规则很简单:
- 任何服务器和客户端发送到对方的数据都被不经过任何改变的直接传递。
- 服务器对于传输连接的任何操作都作用于转发器上(仅间接影响客户端)。
- 客户端对传输连接的任何操作都作用于转发器上(仅间接影响服务器)。
这意味着任何调试命令、调试器输出、控制按键和文件访问都像客户端和服务器直接连接一样起作用。转发器对任何命令都是不可见的。
中断连接的动作会作用于转发器。例如如果在客户端执行qq (Quit)命令,服务器会关闭,并且会向传输器发送一个关闭信号。这使得转发器退出 (除非它使用了-p选项)。又例如, .clients (List Debugging Clients)命令会列出所有客户端的计算机名,但是它显示的是服务器和转发器之间的连接协议。
如果服务器关闭,转发器会自动退出(除非它使用了-p选项)。当转发器关闭时,也会造成调试客户端退出,但是灵巧客户端不会。如果由于某些原因需要直接终止转发器,可以使用任务管理器或kill.exe工具。
转发器示例
假设有三台计算机\\BOXA、\\BOXB和 \\BOXC,并且希望他们分别作为服务器、转发器和客户端。
使用下面的方法在\\BOXA 上启动调试服务器,使用进程122 作为目标:
E:\Debugging Tools for Windows> cdb -server tcp:port=1025,password=wrought -p 122
然后在\\BOXB 上启动转发器:
C:\Misc> dbengprx -c tcp:server=BOXA,port=1025 -s npipe:pipe=MyPipe
最后,在\\BOXC 上启动调试客户端:
G:\Debugging Tools> windbg -remote npipe:server=BOXB,pipe=MyPipe,password=wrought
这里有另外一个例子。符号在远程位置127.0.0.30上。所以决定在目标所在的127.0.0.10计算机上使用进程服务器。转发器放在127.0.0.20。
同时决定使用反向连接,所以首先在127.0.0.30上启动客户端:
G:\Debugging Tools> windbg -premote tcp:clicon=127.0.0.20,port=1033 notepad.exe
然后启动127.0.0.20上的转发器:
C:\Misc> dbengprx -c tcp:clicon=127.0.0.10,port=1025 -s tcp:port=1033,clicon=127.0.0.10
最后启动127.0.0.10上的进程服务器:
E:\Debugging Tools for Windows> dbgsrv -t tcp:port=1025,clicon=127.0.0.20
关于使用转发器的更复杂示例,查看双防火墙。
高级远程调试
本节包含:
调试多台计算机上的目标:
居中的符号
双防火墙
调试多台计算机上的目标
调试器可以同时调试多个dump文件或活动的用户模式进程。查看调试多个目标获取详细信息。
即使多个活动目标在不同的系统上,也可以调试它们。可以简单的在每个系统上启动一个进程服务器,然后使用.attach (Attach to Process) 或.create (Create Process) 命令和-premote 参数指定适当的进程服务器。
当前系统或活动系统是当前正在调试的系统。如果这时再使用.attach 或.create 命令并且不指定-premote ,调试器会在当前系统附加、或创建一个进程。
关于如何控制这样的调试会话的详细信息,查看调试多个目标。
居中的符号
这种情况下有三台计算机。第一台运行目标程序,第二台包含符号,第三台由技术员使用。
由于灵巧客户端在每方面都类似常规的调试器,所以可以同时用来作为调试服务器。这使得可以用居中机器上的灵巧客户端将三台机器连接起来。
首先在\\BOXA 机器上启动进程服务器:
dbgsrv -t npipe:pipe=FarPipe
居中的机器名为\\BOXB ,使用-premote 和-server 参数启动调试器。假设目标程序的PID是400,符号路径是G:\MySymbols:
cdb -server npipe:pipe=NearPipe -premote npipe:server=BOXA,pipe=FarPipe -v -y g:\mysymbols -p 400
然后在第三台机器上如下启动调试客户端:
windbg -remote npipe:server=BOXB,pipe=NearPipe
第三台机器会用来控制调试,而第二台是实际用来处理调试和符号访问的机器。
双防火墙
假设需要对A建筑内的机器进行内核调试,而技术员在建筑C,他/她需要在那里访问符号。但是,两个建筑里面都有防火墙阻止外来的连接。
需要在另一个位置设置一个转发器——例如建筑B。然后可以从A连接到B,同时从C连接到B。
这种情况下需要4台计算机:
- 位于建筑A内的目标机。
- 位于建筑A里面的本地主机。该机器会运行KD连接服务器。它使用1394电缆连接到目标机,并且向外连接到转发器。假设它的IP地址是127.0.10.10。
- 位于建筑B内的计算机。他会运行转发器,假设它的IP是127.0.20.20。
- 技术员所在的建筑C。计算机上会运行WinDbg作为灵巧客户端。假设IP为127.0.30.30。
首先,确认目标机已经配置为可以调试并且被本地主机附加上去。本例中使用1394电缆。
然后,再127.0.20.20上启动转发器:
dbengprx -p -s tcp:port=9001 -c tcp:port=9000,clicon=127.0.10.10
第三步,在建筑A中的127.0.10.10机器上启动KD连接服务器:
kdsrv -t tcp:port=9000,clicon=127.0.20.20,password=longjump
最后,在建筑C的127.0.30.30机器上启动灵巧客户端。(这可以在启动建筑A的服务器之前或之后进行。)
windbg -k kdsrv:server=@{tcp:server=127.0.20.20,port=9001,password=longjump},trans=@{1394:channel=9} -y SymbolPath
5台计算机的情况
当符号在建筑C的计算机上,但是技术员在另外一台计算机上时,情况会更加复杂。
和刚才一样,假设127.0.30.30上有符号,并且它的本地名称为\\BOXC。灵巧客户端可以使用上面一样的命令但是增加一条-server 参数。由于没有人会使用这台机器,所以如果使用KD而不是WinDbg可以减少处理时间:
kd -server npipe:pipe=randomname -k kdsrv:server=@{tcp:server=127.0.20.20,port=9001,password=longjump},trans=@{1394:channel=9} -y SymbolPath
然后在建筑内其他地方的技术员可以用下面的命令启动调试客户端:
windbg -remote npipe:server=\\BOXC,pipe=randomname
注意,密码必须由连接链中的第一个非转发器(\\BOXC上的灵巧客户端)提供,而不是链尾的调试器提供。