Como manipular um descritor de arquivo em outro processo? [duplicado]

0

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 soquetes.

$ 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]
    
por faressoft 17.05.2016 / 21:55

1 resposta

0

Tecnicamente, quase tudo é possível com ptrace() / gdb . Resultados da pesquisa .

Usar ptrace() é dependente do arco, inábil e o AFAICT não é implementado para você. O aplicativo popular é injetar um fd no processo, mas isso é o oposto do que você deseja.

Pensei no que seria necessário e parece muito doloroso.

Você pode usar a abordagem do script gdb e examinar o código-fonte de screenify . Provavelmente ainda é muito difícil comunicar FDs dentro do gdb. A maneira como você comunica os fds é enviá-los como "dados auxiliares" usando sendmsg() em um soquete unix.

Infelizmente, o envio de dados auxiliares geralmente é feito usando uma macro. Embora gdb tenha uma impressão incrível de um interpretador C, não acho possível usar macros.

A outra maneira de passar fds é usar fork() , de modo que pode fornecer algumas opções um pouco mais fáceis (combinadas com exec() ). Infelizmente, parece que ptrace() e fork() não são melhores amigos. Existem alguns comandos gdb específicos do linux que podem fazer o trabalho, mas apenas menciona o suporte para pontos de interrupção; ele não diz se você pode obter o comando call fork() do gdb para funcionar de maneira sensata. Mesmo que funcione, talvez seja necessário mexer com FD_CLOEXEC (close-on-exec) também. Essa é uma macro também.

Não é muito difícil encontrar o valor numérico de uma macro simples (é assim que o screenify foi escrito). A interface da macro para enviar dados auxiliares não é muito complicada, por isso pode ser mais fácil fazer engenharia reversa em vez disso.

    
por 17.05.2016 / 23:14