如何在另一個進程中操作檔案描述符?

如何在另一個進程中操作檔案描述符?

有沒有什麼方法可以操作(讀取、寫入等)路徑中可以找到的任何應用程式的檔案描述符?/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 套接字將它們作為「輔助資料」發送。

不幸的是,發送輔助資料通常是使用巨集完成的。雖然gdbC 解釋器給人留下了深刻的印象,但我認為不可能使用巨集。

傳遞 fds 的另一種方法是使用fork(),因此這可能會提供一些稍微簡單的選項(與 結合使用exec())。不幸的是,它看起來ptrace()並不是fork()最好的朋友。有一些Linux 特定的 gdb 指令這可能可以完成工作,但它只提到對斷點的支援;它沒有說明您是否可以讓 gdb 命令call fork()正常運作。即使它有效,您可能也需要搞亂FD_CLOEXEC(close-on-exec) 。這也是一個宏。

要找到一個簡單宏的數值並不難(這就是 screenify 的寫法)。用於發送輔助資料的巨集介面並不是很複雜,因此對其進行逆向工程可能更容易。

相關內容