如何簡單實現可執行檔案的自我刪除

2021-08-15 23:42:54 字數 1829 閱讀 3072

可執行檔案即 exe 檔案在執行過程中,由系統管理其開啟的控制代碼。此時對該檔案的一些操作是被系統禁止的,比如刪除操作。然而在某些場合,可能須要程式有自我刪除的功能,也就是程式執行結束後刪除自身。基於這個想法,可以有一種很簡單的方法來實現這個基本功能。

本方法基於兩點來實現刪除功能。一是利用 windows 的 command program 的刪除檔案操作;再者就是啟動新的程序來執行這個刪除操作。下面就仔細說明。

windows 中的 command program 是乙個系統的 shell program. 在 windows95/98/me 中,其檔名為 command.com ,而在 nt/2000/xp 中則是 cmd.exe 。我們可以通過環境變數 comspec 得到其全路徑名。

假定目前我們所使用的是 xp ,在命令列中輸入 :

cmd.exe /?

即得到 command shell 的使用方法;其中 /c 的含義是:執行字串指定的命令然後終斷,這正是我們所須要的。這樣利用 command shell 刪除乙個檔案的命令如下:

cmd.exe /c del mypro.exe

這裡要注意一點,檔名應該是短檔名(檔名不得超過 8 個字元 , 字尾不超過 3 個字元)。如果實際檔案是長檔案句,那麼程式中我們可以用 getshortpathname 這個 api 函式來轉換。

接下來我們要做是如何在一新的程序中成功的執行這一指令。起來乙個新程序的命令主要有 shellexecute 和 createprocess 。

先使用 shellexecute 為例。在程式的結束處使用如下語句:

shellexecute(null, "open","cmd.exe", "/c del mypro.exe ", null, sw_hide);

編譯後執行檔案發現執行成功,檔案執行完後被刪除。但是後面做多次實驗後,發現有時檔案執行完後並不會被刪除。通過分析,認為在刪除操作執行時,可執行檔案還未關閉。也就是說只有在執行檔案的程序關閉後,執行刪除操作的程序才能完成操作。這樣就有了乙個問題,系統負責程序和執行緒的排程執行,我們無法人為規定程序或執行緒以某種秩序執行。

對此我的解決辦法是,建立執行刪除操作的程序時設定其為掛起狀態,從而為其的設定乙個低優先順序別,同時提高執行檔案的程序級別,然後才正式起動新程序。這樣基本可以保證兩個程序的先後執行。這樣新的解決方法就是用createprocess以create_suspend標誌來建立新程序,然後用 setpriorityclass來設定相應的優先順序,主程序的優先順序是high_priority_class,而執行刪除操作的程序的優先順序是 idle_priority_class。經過數百次的測試,刪除操作都是成功的。

下面是乙個封裝了刪除操作的函式,函式內起動乙個程序執行command shell的del命令。在程式最後結束處呼叫它,就可以簡單的實現程式的自刪除功能。

#include #include #include int deletemyexe()

// heigthen priority of the current process

setpriorityclass(getcurrentprocess(), high_priority_class);

// set file attribute to normal

setfileattributes(tc***ename, file_attribute_normal);

// depress priority of command process, then start it

setpriorityclass(pi.hprocess, idle_priority_class);

resumethread(pi.hthread);

return 0;

}

如何簡單實現可執行檔案的自我刪除

可執行檔案即 exe 檔案在執行過程中,由系統管理其開啟的控制代碼。此時對該檔案的一些操作是被系統禁止的,比如刪除操作。然而在某些場合,可能須要程式有自我刪除的功能,也就是程式執行結束後刪除自身。基於這個想法,可以有一種很簡單的方法來實現這個基本功能。本方法基於兩點來實現刪除功能。一是利用 wind...

vs 實現執行可執行檔案

有三個api函式可以執行可執行檔案winexec shellexecute和createprocess。1.createprocess因為使用複雜,比較少用。2.winexec主要執行exe檔案。如 winexec notepad.exe readme.txt sw show 3.shellexec...

android 編寫簡單可執行檔案

使用android sdk 原始碼編譯乙個簡單的adb shell 命令下的可執行檔案 在system core 下建立乙個臨時資料夾tmp,並建立了android.mk 和 test.c local path call my dir include clear vars local module ...