
有沒有什麼方法可以操作(讀取、寫入等)路徑中可以找到的任何應用程式的檔案描述符?/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 套接字將它們作為「輔助資料」發送。
不幸的是,發送輔助資料通常是使用巨集完成的。雖然gdb
C 解釋器給人留下了深刻的印象,但我認為不可能使用巨集。
傳遞 fds 的另一種方法是使用fork()
,因此這可能會提供一些稍微簡單的選項(與 結合使用exec()
)。不幸的是,它看起來ptrace()
並不是fork()
最好的朋友。有一些Linux 特定的 gdb 指令這可能可以完成工作,但它只提到對斷點的支援;它沒有說明您是否可以讓 gdb 命令call fork()
正常運作。即使它有效,您可能也需要搞亂FD_CLOEXEC
(close-on-exec) 。這也是一個宏。
要找到一個簡單宏的數值並不難(這就是 screenify 的寫法)。用於發送輔助資料的巨集介面並不是很複雜,因此對其進行逆向工程可能更容易。