삭제된 바이너리 실행 파일의 실행 중인 프로세스를 복구하는 방법

삭제된 바이너리 실행 파일의 실행 중인 프로세스를 복구하는 방법

오랫동안 실행되는 프로세스가 있습니다.

실수로 프로세스의 바이너리 실행 파일을 삭제했습니다.

프로세스가 여전히 실행 중이고 영향을 받지 않으므로 원본 바이너리가 다른 곳에 있어야 합니다...

어떻게 복원할 수 있나요? (저는 CentOS 7을 사용하고 있으며 실행 프로세스는 C++로 작성되었습니다.)

답변1

이는 메모리에만 있고 복구할 수 없습니다. 이 경우 파일 시스템 복구 도구 중 하나를 사용하여 파일 시스템에서(또는 메모리에서) 복구를 시도해야 합니다. 하지만!

$ 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
$ 

통역사의 경우 스크립트 파일을 얻는 것은 아마도 까다로울 수도 있고 불가능할 수도 있습니다. 왜냐하면 스크립트 파일이 무언가를 /proc/$$/exe가리키고 perl입력 파일이 이미 닫혀 있을 수 있기 때문입니다.

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

표준 파일 설명자만 열려 있으므로 x사라졌습니다(비록 인터프리터가 메모리에 무엇을 가지고 있는지 아는 사람은 잠시 동안 파일 시스템에 여전히 있을 수 있지만).

답변2

C++이므로 메모리에서 덤프하는 것이 가능하다고 말씀하셨습니다.

먼저 메모리에서 프로세스를 찾아야 합니다.

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

그럼 버릴 수 있어

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

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

관련 정보