경로에서 찾을 수 있는 응용 프로그램의 파일 설명자를 조작(읽기, 쓰기 등)할 수 있는 방법이 있습니까?/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()
유닉스 소켓을 통해 "보조 데이터"로 보내는 것입니다.
안타깝게도 보조 데이터 전송은 일반적으로 매크로를 사용하여 수행됩니다. C 인터프리터는 인상적 이지만 gdb
매크로를 사용하는 것은 불가능하다고 생각합니다.
fds를 전달하는 또 다른 방법은 를 사용하는 것입니다 fork()
. 따라서 이는 약간 더 간단한 옵션( 와 함께 사용 exec()
)을 제공할 수 있습니다. 안타깝게도 가장 친한 친구는 ptrace()
아닌 것 같습니다. fork()
일부가 있습니다Linux 관련 gdb 명령이렇게 하면 작업이 완료될 수 있지만 중단점에 대한 지원만 언급되며 gdb 명령을 작동시킬 수 있는지 여부는 언급되지 않습니다 call fork()
. 작동하더라도 엉망으로 만들어야 할 수도 있습니다 FD_CLOEXEC
(close-on-exec). 이것도 매크로입니다.
간단한 매크로의 값을 찾는 것은 어렵지 않습니다(screenify가 작성된 방식입니다). 보조 데이터를 전송하기 위한 매크로 인터페이스는 그다지 복잡하지 않으므로 리버스 엔지니어링하는 것이 더 쉬울 수 있습니다.