Odpowiedzi:
X11 można rozmawiać przez TCP lub przez gniazdo domeny Unix lub (w systemie Linux) na gniazdo domeny Unix w abstrakcyjnej przestrzeni nazw.
Gdy DISPLAY jest ustawiony na host:4
skrót tcp/host:4
, klienci używają TCP do łączenia się z serwerem. Port TCP ma wtedy 6000 plus numer wyświetlacza (w tym przypadku 6004).
W takim przypadku możesz przechwycić ruch za pomocą dowolnego sniffera sieciowego, takiego jak tcpdump
lub wireshark
przechwytując ruch TCP na tym porcie.
Kiedy $DISPLAY
jest tylko :4
(skrót unix/:4
), klienci używają gniazda domeny unix. Jedna /tmp/.X11-unix/X4
lub ta sama ścieżka w przestrzeni nazw ABSTRACT (zwykle pokazana jak @/tmp/.X11-unix/X4
na netstat
wyjściu).
Przechwytywanie ruchu jest wtedy trudniejsze.
Jeśli twoje Słuchacze X serwer TCP (ale nie wydają się już dzisiaj), najłatwiej jest zmienić DISPLAY
aby localhost:4
zamiast :4
i przechwytywania ruchu sieciowego na porcie 6004 na interfejsie loopback.
Jeśli tak się nie stanie, możesz użyć socat
jako mężczyzna w środku, który przyjmuje połączenia jako TCP i przekazuje je jako unix lub streszczenie :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Następnie można ustawić $DISPLAY
do localhost:4
i przechwytywanie ruchu sieciowego jak wyżej lub powiedzieć socat
zrzucić go -x -v
.
Teraz, jeśli nie możesz się zmienić $DISPLAY
i chcesz przechwycić ruch już działającej lokalnej aplikacji X, która korzysta z gniazd domeny unix, wtedy jest to trudne.
Jednym z podejść może być użycie strace
(lub równoważnego polecenia w systemie, jeśli nie Linux) do śledzenia wywołań systemowych wysyłania / odbierania, które aplikacja wykonuje w celu komunikacji z serwerem X.
Tutaj za xterm
, obserwuję to robi writev()
, recvfrom()
i recvmsg()
wywołania systemowe na pliku deskryptora 3 do tego. Więc mogę zrobić:
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 -
(lub tshark -Vi -
).
Chodzi o to, aby wyodrębnić znacznik czasu i bajty wysłane / odebrane z wyjścia strace
i użyć text2pcap
do przekonwertowania go na pcap
(dodanie fałszywych nagłówków TCP na porcie 6000 z -T6000,1234
) przed podaniem do wireshark
. Dzielimy także pakiety, aby uniknąć ograniczenia 64 kB maksymalnej długości rekordu pcap.
Pamiętaj, że text2pcap
aby działać poprawnie w odniesieniu do prawidłowego kierunku ruchu, potrzebujesz stosunkowo najnowszej wersji Wireshark.
Jeśli jesteś zainteresowany głównie protokołem X11, a nie podstawowymi funkcjami TCP / IP i Ethernet, i jeśli możesz dostosować ustawienia klienta lub serwera, możesz użyć narzędzia zaprojektowanego specjalnie do przechwytywania i dekodowania ruchu między X11 klient i serwer X11. Inaczej niż w przypadku wireshark
X11, narzędzia te raczej nie będą mylone przez ruch, ponieważ są w pełni zaangażowane.
Głównym z nich jest xscope, który pomimo tego, że nie jest dostępny jako plik binarny dla niektórych dystrybucji Uniksa lub Linuksa, można go łatwo zbudować ze źródła .
Alternatywnie są też xtruss i xtrace, ale nie mam z nimi doświadczenia.
Wszystkie te narzędzia działają jak odwrotne proxy przekazujące połączenia z prawdziwym serwerem X11. Klienci używają po prostu innej zmiennej DISPLAY (lub argumentu -display), aby połączyć się z serwerem proxy.
na przykład:
$ 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
Uwaga: Jeśli z jakiegoś powodu nie możesz zmienić ustawień klientów X11 (wyświetlanie), być może będziesz mógł ponownie skonfigurować serwer, aby nasłuchiwał na innym porcie (zazwyczaj 6001 vs. 6000), a następnie skonfigurować xscope
nasłuchiwanie na oryginalnym porcie (6000).
xtrace -D:1 -d:0 -k
. (Lub x11trace, ponieważ plik wykonywalny jest nazwany w niektórych dystrybucjach)
X11 używa TCP jako protokołu transportowego. Zakres portów TCP dla X11 to zwykle 6000-6063, ale najprawdopodobniej zobaczysz używany port TCP 6000.
Tak więc powinieneś być w stanie użyć dowolnego monitora sieci, aby obserwować ruch, filtrując dla tego zakresu portów i hostów, o których mowa. Wiem też, że wireshark
na przykład zawiera już gotowe ustawienia filtra x11
do monitorowania ruchu, który Cię interesuje.
Na przykład, aby monitorować cały ruch X11 na komputerze lokalnym (jeśli używasz TCP; zapoznaj się z odpowiedzią @ Stéphane Chazelas) użyj następującego filtra:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.