程序的自刪除已經(jīng)不是什么新鮮的話題了,它廣泛運用于木馬、病毒中。試想想,當你的程序還在運行中(通常是完成了駐留、感染模塊),它就自動地把自己從磁盤中刪掉,這樣一來,就做到了神不知鬼不覺,呵呵,是不是很cool呢?
自刪除(Self Deleting)最早的方法是由 Gary Nebbett 大蝦寫的,太經(jīng)典了,不能不提。程序如下:
|
試試編譯它,運行。怎么樣?從你的眼皮底下消失了吧?是不是很神奇?
Gary Nebbett 鉆了系統(tǒng)的一個漏洞,他的程序是關(guān)閉了 exe 文件的 IMAGE(硬編碼為4),然后用 UnmapViewOfFile 解除了 exe 文件在內(nèi)存中的映象,接著通過堆棧傳遞當前程序的 Handle 給 DeleteFile() ,實現(xiàn)了程序的自刪除。
Gary Nebbett 果然不愧為 WIN 系統(tǒng)下頂尖的底層高手。那么是否還有其他的方法實現(xiàn)程序的自刪除呢?答案是肯定的。
在 Win9x/ME 下,還可以利用 WININIT.INI 的一些特性。在 WININIT.INI 文件里面有一個節(jié) [Rename] ,只要在里面寫入要 “Nul=要刪除的文件”,那么下次系統(tǒng)重新啟動的時候,該文件就會被自動刪除了。以下是一個例子:
|
利用這個特性,我們就可以在程序中對這個 ini 文件進行操作。值得注意的是,當需要自刪除的文件多于一個的時候,就不能使用 WritePrivateProfileString 來實現(xiàn),因為這個 API 會阻止多于一個“NUL=”這樣的入口在同一個節(jié)里面出現(xiàn),所以最好還是自己手動實現(xiàn)。
第三種方法是利用批處理文件。先讓我們做一個試驗:
創(chuàng)建一個 a.bat ,給它寫入以下內(nèi)容:
|
現(xiàn)在運行它吧,屏幕一閃而過,最后留下一串字符:“The batch file cannot be found”。這時候它已經(jīng)從你的硬盤中消失了。
這說明,批處理文件是可以刪除自己的,于是我們可以把這個小技巧運用在自己的程序當中:
|
它會重復(fù)不斷地搜索是否有 SelfDelete.exe 這個文件,直到刪除了它為止;當刪除完畢后,這個批處理文件就會把自己刪除。
(注:本方法可以支持所有的 Windows 版本,即 Win9x/Me/NT/2000/XP)
用批處理文件的方法有一個缺陷,就是會突然彈出一個 DOS 窗,冷不防的嚇人一跳,不過據(jù)我所知這是目前唯一可以在 WinXP 下起作用的方法。當然,最理想的方法是用 Gary Nebbett 的那種,不過它的缺陷是沒法在 WinXP 下起作用。