Answers:
您可以通过TCP或Unix域套接字或在抽象名称空间中的Unix域套接字上(在Linux上)谈论X11 。
当DISPLAY设置为时,客户端的host:4
简称tcp/host:4
,使用TCP连接到服务器。然后,TCP端口为6000加上显示号(在这种情况下为6004)。
在这种情况下,你可以捕捉交通与任何网络嗅探器像tcpdump
或wireshark
通过捕捉端口的TCP流量。
$DISPLAY
仅当为时:4
(是的缩写unix/:4
),然后客户端使用unix域套接字。或者/tmp/.X11-unix/X4
,或在相同的路径摘要命名空间(通常示为@/tmp/.X11-unix/X4
在netstat
输出)。
这样,捕获流量变得更加棘手。
如果您的X服务器侦听TCP(但如今它们不再支持),最简单的方法是更改DISPLAY
为localhost:4
而不是:4
并捕获回送接口上端口6004上的网络流量。
如果没有,您可以在中间socat
作为一个男人使用,接受连接作为TCP并将其转发为unix或abstract:
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
然后,您可以如上所述设置$DISPLAY
为localhost:4
并捕获网络流量,或者使用告诉socat
它进行转储-x -v
。
现在,如果您无法更改$DISPLAY
并且想要捕获使用Unix域套接字的已经运行的本地X应用程序的流量,那就麻烦了。
一种方法是使用strace
(如果不是Linux ,则使用系统上的等效命令;如果不是Linux ,则使用等效命令)跟踪应用程序与X服务器进行通信的发送/接收系统调用。
在这里xterm
,我观察到了writev()
,recvfrom()
并且recvmsg()
系统为此调用了文件描述符3。所以我可以做:
strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
perl -lne '
if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
@p = ($p =~ /\\x(..)/g);
$dir = $f eq "writev" ? "O" : "I";
while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
}' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -
(或tshark -Vi -
)。
这个想法是从时间戳的输出中提取时间戳和发送/接收的字节,strace
并用于text2pcap
将其转换为pcap
(在端口6000上添加虚拟TCP头添加-T6000,1234
),然后馈入wireshark
。我们还拆分数据包,以避免对pcap记录的最大长度限制为64kiB。
请注意,要使text2pcap
正确的通信方向正确运行,您需要相对较新的Wireshark版本。
如果您主要对X11协议感兴趣,而不对基础的TCP / IP和以太网内容感兴趣,并且能够调整客户端或服务器设置,则可以使用专门设计用于捕获和解码X11之间流量的工具。客户端和X11服务器。与wireshark
X11解剖器不同,这些工具不太可能被流量所迷惑,因为它们会完全参与其中。
最主要的是xscope,尽管它不能作为某些Unix或Linux发行版的二进制文件提供,但可以很容易地从源代码构建。
所有这些工具的作用就像反向代理,将连接中继到真实的X11服务器。客户端只需使用其他DISPLAY变量(或-display参数)来连接到代理。
例如:
$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
0.00: Client --> 12 bytes
byte-order: LSB first
major-version: 000b
minor-version: 0000
0.00: 692 bytes <-- X11 Server
protocol-major-version: 000b
protocol-minor-version: 0000
release-number: 00adfef8
resource-id-base: 04c00000
resource-id-mask: 001fffff
motion-buffer-size: 00000100
image-byte-order: LSB first
bitmap-format-bit-order: LSB first
bitmap-format-scanline-unit: 20
bitmap-format-scanline-pad: 20
min-keycode: 8 (^H)
max-keycode: 255 (\377)
vendor: "The X.Org Foundation"
pixmap-formats: (7)
roots: (1)
0.00: Client --> 20 bytes
............REQUEST: QueryExtension
name: "BIG-REQUESTS"
0.00: 32 bytes <-- X11 Server
..............REPLY: QueryExtension
present: True
major-opcode: 85
注意:如果由于某种原因您无法更改X11客户端设置(显示),则可以重新配置服务器以侦听其他端口(通常为6001与6000),然后配置xscope
为侦听原始端口(6000)。
xtrace -D:1 -d:0 -k
。(或x11trace,因为可执行文件在某些发行版中被命名)
X11使用TCP作为其传输协议。X11的TCP端口范围通常为6000-6063,但很可能会看到正在使用的TCP端口6000。
因此,您应该能够使用您选择的任何网络监视器通过对该端口范围和相关主机进行过滤来观察流量。我也知道,wireshark
例如,已经包含一个过滤器预设,x11
用于监视您感兴趣的流量。
例如,要监视本地计算机上的所有X11流量(如果使用TCP,请参阅@StéphaneChazelas的回答),请使用以下过滤器:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
。