一種巧妙的刪除程式自己的方法

2021-03-31 08:56:30 字數 1534 閱讀 7460

wsprintf(szcmdline, __text("%s %d /"%s/""), szpathclone, hprocessorig, szpat

horig);

startupinfo si;

zeromemory(&si, sizeof(si));

si.cb = sizeof(si);

process_information pi;

createprocess(null, szcmdline, null, null, true, 0, null, null, &si, &pi);

closehandle(hprocessorig);

closehandle(hfile);

// this original process can now terminate.

} else

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_existin

g, 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等等)。

這裡面沒有甚麼深的技術.再看其他的一些實現刪除自己的例子,比如說在程序退出前,用fwrite等方法輸出乙個.bat檔案,在裡面寫幾句del,然後

winexec一下這個bat檔案即可.

玩兒過dos的蟲蟲大多都會。今天又學一招,爽。

關於組合問題的一種巧妙方法

在演算法設計與分析裡,組合排列 或者表面像排列組合 的問題很好的解決方法主要是回溯法,廣度優先遍曆法。這裡提供關於組合問題一種巧妙的解決辦法。比如我們要從m個元素裡取n個元素的所有組合。我們用乙個m位二進位制數代表m個元素 一位代表乙個元素 取n個元素可以看做是這個m位二進位制數中有n位的值為1.乙...

一種巧妙的取類的虛函式指標的方法

熟悉c 開發的朋友們都知道,每乙個包含虛函式的類的物件的前四個位元組 32位系統中,以下例子都是在32位系統下 的記憶體中存放著該物件的虛函式表的指標。虛函式表中依次存放著該物件的每個虛函式的位址。舉個例子 class testa testa testa testa testa void testa...

一種巧妙的記憶體池演算法 HeapBlock

在乙個簡單的gui庫中看到的演算法,非常巧妙,適用於需要頻繁分配和釋放相同大小資料塊的情況,如gui庫中的視窗結構,socket結構等,演算法額外開支極小。cpp view plain copy print?typedef dword hblockheap typedef unsigned char...