2012-04-01 105 views
9

是否可以用C編寫一個程序,在執行時刪除自身(二進制文件),然後成功終止。如果是這樣,做這件事最簡單的方法是什麼?是否可以用C編寫一個自毀程序?

+3

可能編寫一個程序刪除.exe文件或其他任何東西,儘管您可能需要跳過一些環節,因爲在某些環境中,操作系統在執行時會鎖定.exe。 – 2012-04-01 14:34:44

回答

15

是的。

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

(測試和工程。)

注意,如果argv[0]沒有指向二進制(由主叫改寫),這是不行的。 同樣,如果通過符號鏈接運行,則符號鏈接,而不是二進制文件將被刪除。

此外,如果文件有多個硬鏈接,只有被調用的鏈接將被刪除。

+0

很好用 - 謝謝! – 2012-04-01 14:36:47

+0

好吧,+1然後:)。 – 2012-04-01 14:37:10

+5

在這裏,我們進入關於'argv [0]'的可靠性作爲二進制路徑的常見業務。 POSIX說* *應該指向二進制文件,但不需要它,API允許程序將其設置爲其他內容。最終的結果是,這通常有效,但不可靠。而且,即使您有正確的路徑,二進制文件也可能在多個地方被硬鏈接。 – dmckee 2012-04-01 14:48:17

0

你可以嘗試只刪除程序(FILE *和東西)可執行......但看到該可執行文件是真實中運行它可能無法正常工作。我認爲它就像吃自己一樣,據我所知這不可能,但你可以嘗試使用我上面提到的方法。

0

我認爲這取決於您使用的平臺。基本上,一旦加載可執行文件,對二進制文件的任何後續更改都不會影響正在運行的程序。在Unix中,情況就是這樣,你可以使用unlink系統調用。

我不確定這是否在Windows上是正確的。可能不允許刪除可執行映像。您可以嘗試Windows中的DeleteFile()api。

2

如果操作系統允許運行的程序來刪除自己的二進制文件,然後就找了文件刪除的API,或執行相應的命令system()

如果操作系統不允許這樣,你的程序(我們稱之爲一個)可以構建另一個二進制,包含另一個程序(我們稱之爲)。然後,A會立即退出。

計劃將有一個循環檢查,如果一個仍在運行,並儘快一個退出,將刪掉一個的二進制文件。

+1

反向小約翰! – 2012-04-01 14:45:18

+3

但是B怎麼樣 - 就像雙重自殺出了問題。 – 2012-04-01 14:46:57

+1

呃,這個任務是要殺A,不是嗎? B可以放在某個臨時文件夾中,等待某個時間被清除。 – Imp 2012-04-01 14:48:48

5

我不知道,一個可以方便做一個真正的平臺無關的方式,但你沒有指定平臺的獨立性,所以嘗試以下方法,Linux樣式代碼:

#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 2012-04-01 14:42:47

+0

Woow。有用。你能解釋一下這個參數類型嗎? – Jack 2012-04-01 15:20:05

+1

順便說一句,那些是「main」的非標準參數。鑑於此,它只是爲了讓您的示例代碼更難以讓新手明白... – 2012-04-01 15:22:48

相關問題