刪除程序自身可執行檔案的另一種方法

2021-09-30 08:54:55 字數 1888 閱讀 4680

刪除程序自身可執行檔案的另一種方法 收藏

此文章系收藏之作,並非本人所寫

大家都知道,一般的程式執行的時候,可執行檔案本身是被作業系統保護的,不能用改寫的方式訪問,更別提在本身還在執行的時侯刪除自己了。在lu0的主頁上看到一種undocument的方法,通過改變系統底層的檔案訪問模式實現刪除自己,那是實在功夫。我看了很是佩服。但是有沒有一種用在msdn上就能查到的函式實現呢?有!jeffrey richter給我們做了乙個範例:

deleteme.cpp

module name: deleteme.cpp

written by: jeffrey richter

description: allows an executable file to delete itself

#include

#include

#include

/int winapi winmain(hinstance h, hinstance b, lpstr psz, int n) else {

// clone exe: when original exe terminates, delete it

handle hprocessorig = (handle) _ttoi(__tar**[1]);

waitforsingleobject(hprocessorig, infinite);

closehandle(hprocessorig);

deletefile(__tar**[2]);

// insert code here to remove the subdirectory too (if desired).

// the system will delete the clone exe automatically

// because it was opened with file_flag_delete_on_close

return(0);

看懂了嗎?

這一段程式思路很簡單:不是不能在執行時直接刪除本身嗎?好,那麼程式先複製(clone)乙個自己,用複製品起動另乙個程序,然後自己結束執行,則原來的exe檔案不被系統保護.這時由新程序作為殺手刪除原來的exe檔案,並且繼續完成程式其他的功能。

新程序在執行結束後,複製品被自動刪除。這又是值得介紹的乙個把戲了,注意:

// open the clone exe using file_flag_delete_on_close

handle hfile = createfile(szpathclone, 0, file_share_read, null,open_existing, file_flag_delete_on_close, null);

這裡面的file_flag_delete_on_close標誌,這個標誌是告訴作業系統,當和這個檔案相關的所有控制代碼都被關閉之後(包括上面這個createfile建立的句炳),就把這個檔案刪除。幾乎所有的臨時檔案在建立時,都指明了這個標誌。

另外要注意的是:在複製品程序對原始程式操刀之前,應該等待原程序退出.在這裡用的是程序同步技術.用

handle hprocessorig = openprocess(synchronize, true,getcurrentprocessid());

得到原程序控制代碼.synchronice標誌在nt下有效,作用是使openprocess得到的控制代碼可以做為同步物件.複製品程序用waitforsingleobject函式進行同步,然後乙個deletefile,以及進行其它銷毀證據(jeffrey說:比如刪目錄)的工作,打完收工!

程式是基於console的,通過傳入的引數確定是原始的程序還是複製品新程序,並且得到需要操作的目標檔案的資訊(主要是路徑),複製品放在系統的temp目錄(gettemppath得到),你也可以隨便找個你認為安全的地方(比如:windows/system32等等)。

刪除程序自身可執行檔案的另一種方法

此文章系收藏之作,並非本人所寫 大家都知道,一般的程式執行的時候,可執行檔案本身是被作業系統保護的,不能用改寫的方式訪問,更別提在本身還在執行的時侯刪除自己了。在lu0的 主頁上看到一種undocument的方法,通過改變系統底層的檔案訪問模式實現刪除自己,那是實在功夫。我看了很是佩服。但是有沒有一...

刪除應用程式自身的可執行檔案

下面的 由gary nebbett寫就.gary nebbett乃是windows nt 2000 native api reference的作者.乃nt系統一等一的高手.下面就分析一些他的這段 這段 在process沒有結束前就將啟動process的exe檔案刪除了.int main int ar...

得到程序的父程序的另一種辦法

次貼的防止loader的辦法中使用了nt中的native api,所以無法在win9x me中使用。利用win32提供的toolhelp api,也可以得到乙個程序的父程序的pid。win9x me和win2k xp都支援toolhelp api,但winnt 3.51,4.0 卻不支援。inclu...