Como recuperar o arquivo executável binário excluído de um processo em execução

3

Eu tenho um processo em execução há muito tempo.

Eu acidentalmente excluí o arquivo executável binário do processo.

Como o processo ainda está em execução e não é afetado, deve haver o arquivo binário original em algum outro lugar ....

Como posso recuperar? (Eu uso o CentOS 7, o processo em execução é escrito em C ++)

    
por syko 04.02.2017 / 03:27

2 respostas

7

Ele só poderia estar na memória e não ser recuperável, nesse caso você teria que tentar recuperá-lo do sistema de arquivos usando uma dessas ferramentas de recuperação do sistema de arquivos (ou da memória, talvez). No entanto,

$ cat hamlet.c
#include <unistd.h>
int main(void) { while (1) { sleep(9999); } }
$ gcc -o hamlet hamlet.c
$ md5sum hamlet
30558ea86c0eb864e25f5411f2480129  hamlet
$ ./hamlet &
[1] 2137
$ rm hamlet
$ cat /proc/2137/exe > newhamlet
$ md5sum newhamlet 
30558ea86c0eb864e25f5411f2480129  newhamlet
$ 

Com programas interpretados, obter o arquivo de script pode estar em algum lugar entre complicado e impossível, pois /proc/$$/exe apontará para perl ou qualquer outra coisa, e o arquivo de entrada pode já ter sido fechado:

$ echo sleep 9999 > x
$ perl x &
[1] 16439
$ rm x
$ readlink /proc/16439/exe
/usr/bin/perl
$ ls /proc/16439/fd
0  1  2

Apenas os descritores de arquivo padrão estão abertos, então x já foi embora (embora possa existir por algum tempo ainda no sistema de arquivos, e quem sabe o que o interpretador tem na memória).

    
por 04.02.2017 / 03:42
1

Você disse que seu C ++ deve ser possível despejá-lo da memória.

Primeiro você quer encontrar o processo na memória:

$ cat /proc/[pid]/maps
00400000-00404000 r-xp 00000000 ca:01 16823     /home/ec2-user/a.out (deleted)

Então você pode despejar

$ gdb --pid [pid]
dump memory /home/ec2-user/output 0x00400000 0x00404000

Em seguida, você poderá executá-lo marcando-o como executável ( chmod +x )

$ file output
output: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, missing section headers
    
por 10.06.2018 / 13:16