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.