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.