Risposte:
Puoi parlare X11 su TCP, o su un socket di dominio Unix o (su Linux) su un socket di dominio Unix nello spazio dei nomi astratto .
Quando DISPLAY è impostato su host:4
, abbreviazione di tcp/host:4
, i client usano TCP per connettersi al server. La porta TCP è quindi 6000 più il numero visualizzato (in tal caso 6004).
In tal caso, è possibile acquisire il traffico con qualsiasi sniffer di rete simile tcpdump
o wireshark
acquisendo il traffico TCP su quella porta.
Quando $DISPLAY
è solo :4
(abbreviazione di unix/:4
), i client usano un socket di dominio unix. Sia /tmp/.X11-unix/X4
o lo stesso percorso nel ESTRATTO namespace (generalmente indicato come @/tmp/.X11-unix/X4
in netstat
uscita).
Catturare il traffico è quindi più complicato.
Se i vostri ascolti server X su TCP (ma non tendono a più al giorno d'oggi), il modo più semplice è quello di cambiare DISPLAY
al localhost:4
posto di :4
e catturare il traffico di rete sulla porta 6004 sull'interfaccia di loopback.
In caso contrario, puoi utilizzare socat
come man nel mezzo che accetta connessioni come TCP e le inoltra come unix o abstract :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
È quindi possibile impostare $DISPLAY
per localhost:4
e catturare il traffico di rete di cui sopra o dire socat
a discarica con -x -v
.
Ora, se non puoi cambiare $DISPLAY
e vuoi catturare il traffico di un'applicazione X locale già in esecuzione che utilizza socket di dominio unix, è qui che diventa complicato.
Un approccio potrebbe essere quello di usare strace
(o il comando equivalente sul tuo sistema se non Linux) per tracciare le chiamate di sistema di invio / ricezione che l'applicazione fa per comunicare con il server X.
Qui per xterm
, lo osservo writev()
, recvfrom()
e il recvmsg()
sistema chiama il descrittore di file 3 per questo. Quindi posso fare:
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 -
(o tshark -Vi -
).
L'idea è quella di estrarre il timestamp e i byte inviati / ricevuti dall'output di strace
e utilizzarli text2pcap
per convertirlo in un pcap
(aggiungendo intestazioni TCP fittizie sulla porta 6000 con -T6000,1234
) prima di alimentare wireshark
. Abbiamo anche diviso i pacchetti per evitare il limite di 64 kB sulla lunghezza massima di un record pcap.
Si noti che per text2pcap
funzionare correttamente per ottenere la giusta direzione del traffico, è necessaria una versione relativamente recente di WireShark.
Se sei principalmente interessato al protocollo X11 e non alle cose TCP / IP e Ethernet sottostanti e se sei in grado di regolare le impostazioni del client o del server, potresti utilizzare uno strumento appositamente progettato per acquisire e decodificare il traffico tra un X11 client e un server X11. A differenza del wireshark
dissettore X11, è improbabile che questi strumenti vengano confusi dal traffico, essendo pienamente coinvolti con esso.
Il principale è xscope che, nonostante non sia disponibile come binario per alcune distribuzioni Unix o Linux, può essere facilmente compilato dal sorgente .
In alternativa, ci sono anche xtruss e xtrace ma non ho esperienza con loro.
Tutti questi strumenti agiscono come proxy inversi che inoltrano connessioni a un vero server X11. I client usano semplicemente una variabile DISPLAY diversa (o argomento -display) per connettersi al proxy.
per esempio:
$ 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
Nota: se per qualche motivo non è possibile modificare le impostazioni dei client X11 (display), potrebbe essere possibile riconfigurare il server per l'ascolto di una porta diversa (in genere 6001 vs 6000) e quindi configurare xscope
per l'ascolto sulla porta originale (6000).
xtrace -D:1 -d:0 -k
. (O x11trace, dato che l'eseguibile è chiamato in alcune distro)
X11 utilizza TCP come protocollo di trasporto. L'intervallo di porte TCP per X11 è in genere 6000-6063, ma molto probabilmente vedrai la porta TCP 6000 in uso.
Quindi, dovresti essere in grado di utilizzare qualsiasi monitor di rete di tua scelta per osservare il traffico filtrando per questo intervallo di porte e gli host in questione. So anche che wireshark
, ad esempio, contiene già un filtro predefinito x11
per monitorare il traffico che ti interessa.
Ad esempio, per monitorare tutto il traffico X11 sul computer locale (se si utilizza TCP; fare riferimento alla risposta di @ Stéphane Chazelas) utilizzare il seguente filtro:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.