どのようにキャプチャするX11プロトコルトラフィック?
2つのコンピュータ間、およびローカルコンピュータのX11サーバーとX11クライアント間でX11トラフィックをキャプチャする方法を見つける必要があります。
ベストアンサー1
TCP、Unixドメインソケット、または(Linuxの場合)Unixドメインソケットを介してX11と通信できます。抽象的な名前空間。
host:4
DISPLAYが(省略形)に設定されている場合、tcp/host:4
クライアントはTCPを使用してサーバーに接続します。 TCPポートは、6000にディスプレイ番号(この例では6004)を加えた値です。
この場合、ネットワークスニファを使用してそのポートからTCPトラフィックをtcpdump
キャプチャするなど、トラフィックをキャプチャできます。wireshark
$DISPLAY
is only :4
(の省略形)の場合、unix/:4
クライアントはUnixドメインソケットを使用します。/tmp/.X11-unix/X4
同じ長さでも抽象的な名前空間(通常は出力@/tmp/.X11-unix/X4
に表示されますnetstat
)
トラフィックのキャプチャがさらにトリッキーになります。
XサーバーがTCPをリッスンしていたがもはやリッスンしない場合、最も簡単な方法はDISPLAY
代わりにループバックインターフェイスのポート6004でネットワークトラフィックをlocalhost:4
キャプチャするように変更することです。:4
それ以外の場合は、次のものをsocat
使用できます。中間者TCP接続を受け入れ、次のように渡します。Unixまたは抽象的な:
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
その後、上記のように設定$DISPLAY
してlocalhost:4
ネットワークトラフィックをキャプチャするか、socat
ユーザーにダンプするように指示できます-x -v
。
$DISPLAY
これで、Unixドメインソケットを使用している実行中のローカルXアプリケーションからのトラフィックを変更することができず、キャプチャしたい場合はこれが難しくなります。
strace
1つのアプローチは、アプリケーションがXサーバーと通信するために実行する送受信システムコールを追跡すること(またはLinux以外の場合はシステムの同等のコマンド)を使用することです。
ここでxterm
私はそれが起こっていることを観察し、writev()
そのためにファイル記述子3に対してシステムコールを作成しました。だから私はこれを行うことができます:recvfrom()
recvmsg()
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 -
)。
アイデアは、出力からタイムスタンプと送信/受信バイトを抽出し、それを変換(ポート6000にダミーTCPヘッダーを追加)strace
した後。また、pcapレコードの最大長制限である64kiBを避けるためにパケットを分割します。text2pcap
pcap
-T6000,1234
wireshark
トラフィックの方向を正しく決定するには、text2pcap
比較的新しいバージョンのWiresharkが必要です。