Você pode falar sobre o TCP X11, ou sobre um soquete de domínio Unix ou (no Linux) em um soquete de domínio Unix no namespace abstract .
Quando DISPLAY é definido como host:4
, abreviação de tcp/host:4
, os clientes usam o TCP para se conectar ao servidor. A porta TCP é então 6000 mais o número de exibição (nesse caso 6004).
Nesse caso, você pode capturar o tráfego com qualquer sniffer de rede como tcpdump
ou wireshark
, capturando o tráfego TCP nessa porta.
Quando $DISPLAY
é apenas :4
(abreviação de unix/:4
), os clientes usam um soquete de domínio unix. /tmp/.X11-unix/X4
ou o mesmo caminho no namespace ABSTRACT (normalmente mostrado como @/tmp/.X11-unix/X4
in netstat
output).
Capturar o tráfego é mais complicado.
Se o seu servidor X escuta no TCP (mas eles tendem a não mais mais atualmente), o mais fácil é alterar DISPLAY
para localhost:4
em vez de :4
e capturar o tráfego de rede na porta 6004 na interface de loopback.
Se não, você pode usar socat
como um homem no meio que aceita conexões como TCP e as encaminha como unix ou :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Você pode então definir $DISPLAY
para localhost:4
e capturar o tráfego de rede como acima ou informar socat
para despejá-lo com -x -v
.
Agora, se você não puder alterar $DISPLAY
e quiser capturar o tráfego de um aplicativo X local em execução que use soquetes de domínio unix, é aí que fica complicado.
Uma abordagem poderia ser usar strace
(ou o comando equivalente em seu sistema, se não Linux) para rastrear as chamadas do sistema de envio / recebimento que seu aplicativo faz para se comunicar com o servidor X.
Aqui para xterm
, observo que writev()
, recvfrom()
e recvmsg()
chama o sistema no descritor de arquivo 3 para isso. Então eu posso fazer:
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 -
(ou tshark -Vi -
).
A ideia é extrair o registro de data e hora e bytes enviados / recebidos da saída de strace
e usar text2pcap
para converter isso em pcap
(adicionando cabeçalhos TCP simulados na porta 6000 com -T6000,1234
) antes de alimentar codificar%. Também dividimos pacotes para evitar o limite de 64 kB no comprimento máximo de um registro pcap.
Observe que, para que wireshark
funcione corretamente no que diz respeito a acertar a direção do tráfego, você precisa de uma versão relativamente recente do wireshark.