Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C 언어 자기 파괴 코드 만들기 – 실행 후 스스로 삭제되는 프로그램

이번 글에서는 C 언어로 자기 파괴 코드(self-destructing code)를 만드는 방법을 살펴보겠습니다. 자기 파괴 코드란 프로그램을 실행한 뒤, 실행이 끝나면 자신의 실행 파일을 스스로 삭제하는 코드를 말합니다.

구현 자체는 매우 간단합니다. 파일을 삭제하려면 우선 실행 파일의 이름을 알아내야 하는데, 이는 명령줄 인자(command line arguments)를 통해 얻을 수 있습니다. 배열 argv[0]에는 항상 실행 파일의 이름이 저장되므로, 표준 라이브러리의 remove() 함수에 이 값을 넘겨주면 해당 파일을 손쉽게 삭제할 수 있습니다.

그런데 아래 예제를 보면 파일이 삭제된 이후에도 한 줄이 더 출력됩니다. 파일이 이미 존재하지 않는데 어떻게 다음 문장이 실행될 수 있을까요?

동작 원리

비결은 프로그램이 실행되는 방식에 있습니다. 운영체제는 프로그램을 실행하기 전에 컴파일된 전체 코드를 주 메모리(RAM)로 복사해 적재합니다. 즉, 실제로 실행되는 것은 디스크에 있는 실행 파일 자체가 아니라 메모리에 올라간 복사본입니다. 따라서 원본 파일이 삭제된 후에도 메모리에 적재된 코드는 끝까지 정상적으로 실행되며, 마지막 문장까지 출력되는 것입니다.

예제 코드

#include<stdio.h>
int main(int c, char *argv[]) {
    printf("After completing this, the file will be removed\n");
    remove(argv[0]); // argv[0]: 실행 파일의 이름을 삭제
    printf("Removed\n");
    return 0;
}

실행 결과

After completing this, the file will be removed
Removed

참고 사항

  • 운영체제별 차이: Unix/Linux 환경에서는 실행 중인 파일도 삭제(unlink)할 수 있지만, Windows에서는 실행 중인 실행 파일이 운영체제에 의해 잠기기 때문에 remove() 호출이 실패할 수 있습니다.
  • argv[0]의 특성: argv[0]은 프로그램이 실행된 방식에 따라 전체 경로를 포함할 수도 있고 파일 이름만 담고 있을 수도 있습니다. 실무에서는 삭제 전에 경로를 정확히 확인하는 것이 안전합니다.