此文章系收藏之作,並非本人所寫
大家都知道,一般的程式執行的時候,可執行檔案本身是被作業系統保護的,不能用改寫的方式訪問,更別提在本身還在執行的時侯刪除自己了。在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(__targv[1]);
waitforsingleobject(hprocessorig, infinite);
closehandle(hprocessorig);
deletefile(__targv[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...