パスにあるアプリケーションのファイル記述子を操作(読み取り、書き込みなど)する方法はありますか?/proc/{pid}/fd
特にソケットの場合。
$ ll /proc/4229/fd
total 0
lrwx------. 1 vagrant vagrant 64 May 18 01:10 0 -> socket:[34147]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 1 -> socket:[34149]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 10 -> /dev/null
lrwx------. 1 vagrant vagrant 64 May 18 01:10 11 -> socket:[34943]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 13 -> socket:[34945]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 14 -> socket:[34948]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 15 -> socket:[34950]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 2 -> socket:[34151]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 3 -> socket:[34153]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 4 -> pipe:[34155]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 5 -> pipe:[34155]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 6 -> anon_inode:[eventpoll]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 7 -> pipe:[34156]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 8 -> pipe:[34156]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 9 -> anon_inode:[eventfd]
ベストアンサー1
ptrace()
技術的に/を使用すると、ほぼすべてが可能ですgdb
。 検索結果。
使用法はptrace()
アーキテクチャによって異なり、厄介であり、AFAICTは誰もそれを実装しません。広く使用されているアプリケーションはfdをプロセスに注入することですが、これは望むものとは反対です。
何が必要かを考えてみると痛みを感じました。
gdbスクリプトメソッドを使用してソースコードを表示できますフィルター。 gdb内でFDを通信することは依然として非常に厄介です。 fdと通信する方法は、sendmsg()
Unixソケットを介して「セカンダリデータ」に送信することです。
残念ながら、補助データ転送は通常マクロを使用して行われる。 Cインタプリタは印象的ですが、gdb
マクロを使用することは不可能だと思います。
fdsを渡すもう1つの方法はを使用することですfork()
。したがって、これは少し簡単なオプション(と一緒に使用exec()
)を提供できます。残念ながら、親友ではptrace()
ないようです。fork()
いくつかありますLinux固有のgdbコマンドこれは操作を完了することができますが、ブレークポイントのサポートのみを参照し、gdbコマンドを操作できるかどうかについては言及しませんcall fork()
。うまくいっても台無しにする必要があるかもしれませんFD_CLOEXEC
(close-on-exec)。これもマクロです。
単純なマクロの値を見つけることは難しくありません(screenifyが書かれた方法です)。セカンダリデータを転送するためのマクロインタフェースはあまり複雑ではないので、リバースエンジニアリングする方が簡単です。