
Existe alguma maneira de manipular (ler, escrever, etc.) um descritor de arquivo para qualquer aplicativo que possa ser encontrado no caminho ?/proc/{pid}/fd
Especialmente para tomadas.
$ 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]
Responder1
Tecnicamente, quase tudo é possível com ptrace()
/ gdb
. Procurar Resultados.
O uso ptrace()
depende do arco, é estranho e o AFAICT ninguém o implementou para você. A aplicação popular é injetar um fd no processo, mas isso é quase o oposto do que você deseja.
Pensei no que seria necessário e parece muito doloroso.
Você poderia usar a abordagem de script gdb e observar o código-fonte defiltrar. Provavelmente ainda é muito estranho comunicar FDs de dentro do gdb. A maneira como você comunica fds é enviá-los como "dados auxiliares" usando sendmsg()
um soquete unix.
Infelizmente, o envio de dados auxiliares geralmente é feito usando uma macro. Embora gdb
dê uma impressão incrível de um intérprete C, não acho que seja possível usar macros.
A outra maneira de passar fds é usando fork()
, então isso pode fornecer algumas opções um pouco mais fáceis (combinadas com exec()
). Infelizmente parece ptrace()
e fork()
não são melhores amigos. Há algunscomandos gdb específicos do Linuxo que pode funcionar, mas menciona apenas suporte para pontos de interrupção; não diz se você pode fazer com que o comando gdb call fork()
funcione de maneira sensata. Mesmo que funcione, talvez você precise mexer com FD_CLOEXEC
(close-on-exec) também. Isso também é uma macro.
Não é muito difícil encontrar o valor numérico de uma macro simples (é assim que o screenify foi escrito). A interface macro para enviar dados auxiliares não é muito complicada, então pode ser mais fácil fazer engenharia reversa.