Ответы:
Вы можете общаться с X11 через TCP, или через сокет домена Unix, или (в Linux) через сокет домена Unix в абстрактном пространстве имен.
Если для параметра DISPLAY установлено значение host:4
short tcp/host:4
, клиенты используют TCP для подключения к серверу. Порт TCP равен 6000 плюс номер дисплея (в данном случае 6004).
В этом случае вы можете захватывать трафик с помощью любого сетевого анализатора, например, tcpdump
или wireshark
путем захвата трафика TCP на этом порту.
Когда $DISPLAY
используется только :4
(сокращение unix/:4
), клиенты используют сокет домена unix. Либо /tmp/.X11-unix/X4
или тот же путь в пространстве имен ABSTRACT (обычно отображается как @/tmp/.X11-unix/X4
в netstat
выходных данных).
Захватить трафик будет сложнее.
Если X сервер прослушивает TCP (но они , как правило , не больше в настоящее время), проще всего изменить , DISPLAY
чтобы localhost:4
вместо того , чтобы :4
и захватить сетевой трафик на порт 6004 на кольцевом интерфейсе.
Если это не так, вы можете использовать socat
в качестве человека посередине, который принимает соединения как TCP и перенаправляет их как unix или абстрактные :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
После этого вы можете установить , $DISPLAY
чтобы localhost:4
и захватить сетевой трафик , как указано выше , или сказать , socat
чтобы сбросить его с -x -v
.
Теперь, если вы не можете измениться $DISPLAY
и хотите перехватить трафик уже запущенного локального приложения X, использующего доменные сокеты Unix, вот где это сложно.
Одним из подходов может быть использование strace
(или эквивалентная команда в вашей системе, если не 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
(добавление фиктивных заголовков TCP на порт 6000 с -T6000,1234
) перед передачей в wireshark
. Мы также разделяем пакеты, чтобы избежать ограничения в 64 КБ на максимальную длину записи pcap.
Обратите внимание, что для text2pcap
правильной работы в отношении определения направления движения вам нужна относительно недавняя версия wireshark.
Если вы в основном заинтересованы в протоколе X11, а не в базовых компонентах TCP / IP и Ethernet, и если вы можете настроить параметры клиента или сервера, вы можете использовать инструмент, специально разработанный для захвата и декодирования трафика между X11. клиент и сервер X11. В отличие от wireshark
диссектора X11, эти инструменты вряд ли будут смущать трафик, будучи полностью вовлеченным в него.
Основным из них является xscope, который, несмотря на то, что он недоступен в виде двоичного файла для некоторых дистрибутивов Unix или Linux, может быть легко собран из исходного кода .
Кроме того, есть также xtruss и xtrace, но у меня нет опыта работы с ними.
Все эти инструменты действуют как обратные прокси-серверы, ретранслирующие соединения с настоящим сервером 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 в качестве транспортного протокола. Диапазон портов TCP для X11 обычно составляет 6000-6063, но, скорее всего, вы увидите, что используется порт TCP 6000.
Таким образом, вы должны иметь возможность использовать любой сетевой монитор по вашему выбору для наблюдения за трафиком путем фильтрации для данного диапазона портов и рассматриваемых хостов. Я также знаю, что wireshark
, например, уже содержит предустановку фильтра x11
для отслеживания интересующего вас трафика.
Например, чтобы отслеживать весь трафик X11 на локальном компьютере (если используется TCP; см. Ответ @ Stéphane Chazelas), используйте следующий фильтр:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
.