2012-04-01 2 views
9

실행시 자동으로 바이너리를 삭제 한 다음 성공적으로 종료하는 C 프로그램을 작성할 수 있습니까? 그렇다면 가장 쉬운 방법은 무엇입니까?C로 자체 파괴 프로그램을 작성할 수 있습니까?

+3

.exe 파일을 삭제하는 프로그램을 작성하는 것이 가능할 수도 있습니다. 일부 환경에서는 OS가 실행 중 .exe를 잠그기 때문에 어떤 농구를 뛰어 넘어야 할 수도 있습니다. –

답변

15

예.

#include <unistd.h> 
int main(int argc, char* argv[]) 
{ 
    return unlink(argv[0]); 
} 

(테스트 및 작동합니다.) argv[0] 이진 가리 키지 않는 경우 (호출자에 의해 다시) 것을

참고이 작동하지 않습니다. 마찬가지로 심볼릭 링크를 실행하면 바이너리가 아닌 심볼릭 링크가 삭제됩니다.

또한 파일에 여러 하드 링크가있는 경우에는 호출 된 링크 만 제거됩니다.

+0

위대한 작품 - 감사합니다! –

+0

좋아, +1 :). –

+5

여기서 우리는 argv [0]'의 신뢰성에 대한 일반적인 비즈니스를 이진 경로로 사용합니다. POSIX는 바이너리를 가리켜 야한다고 말했지만 필요하지는 않으며 API는 프로그램이 그것을 다른 것으로 설정할 수있게 해준다. 최종 결과는 정상적으로 작동하지만 신뢰할 수는 없습니다. 또한 올바른 경로가 있어도 바이너리가 여러 곳에서 하드 링크 될 수 있습니다. – dmckee

0

프로그램 (FILE * 등)에서 실행 파일을 삭제하려고 할 수는 있지만 실행 파일은 실행중인 파일이므로 작동하지 않을 수 있습니다. 나는 너 자신을 먹는 것을 좋아한다. 그리고 내가 아는 한 그것이 불가능하다는 것을 알지만, 내가 위에서 언급 한 방법을 사용하여 그것을 시도해 볼 수는있다.

0

나는 그것이 사용중인 플랫폼에 따라 다르다고 생각합니다. 기본적으로, 일단 실행 파일이로드되면, 이후의 바이너리 변경은 실행중인 프로그램에 영향을 미치지 않습니다. Unix에서는이 경우가 있으며 unlink 시스템 호출을 사용할 수 있습니다.

Windows에서 true인지 아닌지 잘 모르겠습니다. 실행 가능 이미지를 삭제할 수 없습니다. Windows에서 DeleteFile() API를 사용해 볼 수 있습니다.

2

운영 체제에서 실행중인 프로그램이 자체 바이너리를 삭제하도록 허용 한 경우 파일 삭제를위한 API를 찾거나 해당 system() 명령을 실행하십시오. OS가이를 허용하지 않는 경우

, 프로그램이 다른 프로그램을 포함, 다른 바이너리를 만들 수있다 (의는 그것을를 부르 자) (의이 B를 부르 자). 그런 다음 A이 즉시 종료됩니다.

프로그램 B 여전히 의 바이너리를 지울 것 B 즉시 같은 종료 될 실행하고 경우 확인 단일 루프를 가질 것이다.

+1

리틀 리틀 존! –

+3

하지만 B에 대해서는 어떨까요? 이중 자살은 잘못되었습니다. –

+1

글쎄, 임무는 A를 죽이는 것이 었지? B는 일부 임시 폴더에서 휴식을 취할 수 있으며 언젠가는 휩쓸 리기를 기다릴 수 있습니다. – Imp

5

나는 사람이 진정으로 플랫폼에 독립적 인 방법으로 그것을 할 편리하게 할 수 있음을 알 수는 없지만, 리눅스 스타일의 코드 플랫폼 독립성을 지정, 그래서 다음을 시도하지 않았다

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) { 
    printf("Read carefully! You cannot print this message again.\n"); 
    return unlink(argv[0]); 
} 

얼마나 가까이를 그것이 당신이 원하는 것입니까?

+9

그것은 main()에 대한 논쟁의 가장 까다로운 타이핑입니다. – blueshift

+0

와우. 그것은 작동합니다. 이 인수 유형에 대해 설명 할 수 있습니까? – Jack

+1

이것들은 부수적으로'main'의 비표준 인수입니다. 감안할 때, 그것은 신입 사원이 이해할 수 있도록 예제 코드를 더 어렵게 만드는 역할을합니다 ... –

관련 문제