실행시 자동으로 바이너리를 삭제 한 다음 성공적으로 종료하는 C 프로그램을 작성할 수 있습니까? 그렇다면 가장 쉬운 방법은 무엇입니까?C로 자체 파괴 프로그램을 작성할 수 있습니까?
답변
예.
#include <unistd.h>
int main(int argc, char* argv[])
{
return unlink(argv[0]);
}
(테스트 및 작동합니다.) argv[0]
이진 가리 키지 않는 경우 (호출자에 의해 다시) 것을
참고이 작동하지 않습니다. 마찬가지로 심볼릭 링크를 실행하면 바이너리가 아닌 심볼릭 링크가 삭제됩니다.
또한 파일에 여러 하드 링크가있는 경우에는 호출 된 링크 만 제거됩니다.
위대한 작품 - 감사합니다! –
좋아, +1 :). –
여기서 우리는 argv [0]'의 신뢰성에 대한 일반적인 비즈니스를 이진 경로로 사용합니다. POSIX는 바이너리를 가리켜 야한다고 말했지만 필요하지는 않으며 API는 프로그램이 그것을 다른 것으로 설정할 수있게 해준다. 최종 결과는 정상적으로 작동하지만 신뢰할 수는 없습니다. 또한 올바른 경로가 있어도 바이너리가 여러 곳에서 하드 링크 될 수 있습니다. – dmckee
프로그램 (FILE * 등)에서 실행 파일을 삭제하려고 할 수는 있지만 실행 파일은 실행중인 파일이므로 작동하지 않을 수 있습니다. 나는 너 자신을 먹는 것을 좋아한다. 그리고 내가 아는 한 그것이 불가능하다는 것을 알지만, 내가 위에서 언급 한 방법을 사용하여 그것을 시도해 볼 수는있다.
나는 그것이 사용중인 플랫폼에 따라 다르다고 생각합니다. 기본적으로, 일단 실행 파일이로드되면, 이후의 바이너리 변경은 실행중인 프로그램에 영향을 미치지 않습니다. Unix에서는이 경우가 있으며 unlink 시스템 호출을 사용할 수 있습니다.
Windows에서 true인지 아닌지 잘 모르겠습니다. 실행 가능 이미지를 삭제할 수 없습니다. Windows에서 DeleteFile() API를 사용해 볼 수 있습니다.
운영 체제에서 실행중인 프로그램이 자체 바이너리를 삭제하도록 허용 한 경우 파일 삭제를위한 API를 찾거나 해당 system()
명령을 실행하십시오. OS가이를 허용하지 않는 경우
, 프로그램이 다른 프로그램을 포함, 다른 바이너리를 만들 수있다 (의는 그것을를 부르 자) (의이 B를 부르 자). 그런 다음 A이 즉시 종료됩니다.
프로그램 B는 여전히 의 바이너리를 지울 것 B 즉시 같은 종료 될 실행하고 경우 확인 단일 루프를 가질 것이다.
리틀 리틀 존! –
하지만 B에 대해서는 어떨까요? 이중 자살은 잘못되었습니다. –
글쎄, 임무는 A를 죽이는 것이 었지? B는 일부 임시 폴더에서 휴식을 취할 수 있으며 언젠가는 휩쓸 리기를 기다릴 수 있습니다. – Imp
나는 사람이 진정으로 플랫폼에 독립적 인 방법으로 그것을 할 편리하게 할 수 있음을 알 수는 없지만, 리눅스 스타일의 코드 플랫폼 독립성을 지정, 그래서 다음을 시도하지 않았다
#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]);
}
얼마나 가까이를 그것이 당신이 원하는 것입니까?
- 1. 자체 수정 PowerShell 스크립트를 작성할 수 있습니까?
- 2. html의 자체 파괴 버튼
- 3. Python으로 작성된 프로그램을 AppleScript로 작성할 수 있습니까?
- 4. 우리는 C 언어로 아이폰 프로그램을 작성할 수 있습니까?
- 5. 자체 파괴 프로세스 유닉스 C
- 6. 스레드에 대한 자체 파괴 타이머?
- 7. 컨텍스트를 파괴 할 수 있습니까?
- 8. C로 float을 반올림하는 함수가 있습니까? 아니면 직접 작성할 필요가 있습니까?
- 9. Windows 7 용 자체 로그온 및 인증 응용 프로그램을 작성할 수 있습니까?
- 10. 응용 프로그램을 자체 파괴하는 방법?
- 11. 세션이 자체 파괴 된 시간을 가지고 있습니다.
- 12. 누군가 아주 간단한 멀티 스레드 프로그램을 작성할 수 있습니까?
- 13. 온라인 검색 결과를 얻기 위해 프로그램을 작성할 수 있습니까?
- 14. IE8을 사용하여 단일 탭 웹 응용 프로그램을 작성할 수 있습니까?
- 15. CA를 설치하는 iOS 응용 프로그램을 작성할 수 있습니까?
- 16. PHP를 사용하여 Windows 콘솔 응용 프로그램을 작성할 수 있습니까?
- 17. 서버가 필요없는 로컬 웹 응용 프로그램을 작성할 수 있습니까?
- 18. .NET에서 Windows CE 용 Silverlight 응용 프로그램을 작성할 수 있습니까?
- 19. ANSI - C 스크립팅을 사용하여 웹 응용 프로그램을 작성할 수 있습니까?
- 20. Zune HD 용 응용 프로그램을 작성할 수 있습니까?
- 21. 메모리를 차지하지 않고 아무것도하지 않는 C 프로그램을 작성할 수 있습니까?
- 22. Mac이 없으면 Objective-C로 프로그램을 개발하는 법을 배울 수 있습니까?
- 23. Vala에서 iPhone 용으로 코드를 작성할 수 있습니까?
- 24. Grails에서 Spring을 작성할 수 있습니까?
- 25. Javascript로 컴파일러를 작성할 수 있습니까?
- 26. 어떻게이 쿼리를 작성할 수 있습니까?
- 27. Groovy에서 어노테이션을 작성할 수 있습니까?
- 28. C#으로 플래시 컨텐츠를 작성할 수 있습니까?
- 29. 자체 업데이트 ASP.NET 웹 응용 프로그램을 구현할 수 있습니까?
- 30. Shoes.rb 자체 포함 응용 프로그램을 만들 수 있습니까?
.exe 파일을 삭제하는 프로그램을 작성하는 것이 가능할 수도 있습니다. 일부 환경에서는 OS가 실행 중 .exe를 잠그기 때문에 어떤 농구를 뛰어 넘어야 할 수도 있습니다. –