
説明するのは少し難しいですが、strace
ソケットが開いているPIDを入力しても通信が見えないことがわかりました。ソケットファイルの真ん中に座って通信を観察するにはどうすればよいですか?
答え1
ソケットは、通信に使用されるカーネルAPIです。ソケットAPIを使用すると、TCP / IP接続、SCTP接続、UDPデータグラムを介して2つのエンドポイント間、またはUnixドメインソケットを使用して2つのプロセス(データグラムまたは接続)間でデータを交換できます。
カーネルAPIとして、ソケットとのすべての対話はシステムコール(、、、、、、、、、... )を介しsocket
て行われます。bind
connect
listen
accept
sendmsg
send
recv
write/read
したがって、通常、システムコールの追跡strace
によってこれを追跡することが可能です。追跡できないstrace
唯一のstrace
通信メカニズムは共有メモリのIPCです(メモリから何かを読み書きすることは明らかにシステムコールを含まないためです)。
あなたの場合は、他のものである可能性が高くなります。アプリケーションはマルチスレッドであり、正しいスレッドを追跡しないと確信しています。または、アプリケーションが setuid/setgid で、スーパーユーザーとして起動しないことがあります。
Unixドメインソケットを介して交換されたコンテンツを追跡する場合は、オプションは次のとおりです。
strace
その他のptrace
デバッガ(トラッキングサーバーまたはクライアント)- 監査システム(
auditd
/auditctl
)、再びシステムコールの追跡 - トリックを使用して
LD_PRELOAD
ソケットと対話するシステムコールをラップします。 - アプリケーションのコードを計測し、そこにロギングを追加します。
- 前述のように、systemtapおよびその他の低レベルカーネルトレース/デバッグシステム
- 中央の人を挿入します。
socat
MITMの場合は、たとえばX11などの接続指向のUnixドメインソケットを使用できます。
socat -x unix-listen:/tmp/.X11-unix/X42,fork unix:/tmp/.X11-unix/X0
DISPLAY=:42 xlogo
xlogo
これにより、Xサーバーと交換されたX11トラフィックが表示されます。
答え2
「ソケットトレース」は不可能です。 straceはプロセスで機能するため、ソケットと通信しているすべてのプロセスを追跡できますが、ソケットに関連するすべての通信を表示するためにstraceを使用することはできません。あなた可能オペレーティングシステムで利用可能な場合は、dtraceまたはsystemtapを使用してどこかに移動できますが、かなりの作業が必要です。