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