Como manipular um descritor de arquivo em outro processo?

Como manipular um descritor de arquivo em outro processo?

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 gdbdê 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.

informação relacionada