下面的**由gary nebbett寫就.gary nebbett乃是windows nt/2000 native api reference的作者.乃nt系統一等一的高手.下面就分析一些他的這段**.
這段**在process沒有結束前就將啟動process的exe檔案刪除了.
int main(int argc, char *argv)
return 0;
} 現在,我們先看一下堆疊中的東西
偏移 內容
24 0
20 0
16 offset buf
12 address of exitprocess
8 module
4 address of deletefile
0 address of unmapviewoffile
呼叫ret返回到了unmapviewoffile,也就是棧裡的偏移0所指的地方.當進入unmapviewoffile的流程時,棧裡見到的是返回位址deletefile和hmodul module.也就是說呼叫完畢後返回到了deletefile的入口位址.當返回到deletefile時,看到了exitprocess的位址,也就是返回位址.和引數eax,而eax則是buffer.buffer存的是exe的檔名.由getmodulefilename(module, buf, sizeof buf)返回得到.執行了deletefile後,就返回到了exitprocess的函式入口.並且引數為0而返回位址也是0.0是個非法位址.如果返回到位址0則會出錯.而呼叫exitprocess則應該不會返回.
這段**的精妙之處在於:
1.如果有檔案的handle開啟,檔案刪除就會失敗,所以,closehandle(handle(4));是十分巧妙的一手.handle4是os的硬編碼,對應於exe的image.在預設情況下,os假定沒有任何呼叫會關閉image section的handle,而現在,該handle被關閉了.刪除檔案就解除了檔案對應的乙個控制代碼.
2.由於unmapviewoffile解除了另外乙個對應image的handle,而且解除了image在記憶體的對映.所以,後面的任何**都不可以引用image對映位址內的任何**.否則就os會報錯.而現在的**在unmapviewoffile後則剛好沒有引用到任何image內的**.
3.在exitprocess之前,exe檔案就被刪除了.也就是說,程序尚在,而主線程所在的exe檔案已經沒了.(winnt/9x都保護這些被對映到記憶體的win32 image不被刪除.)
程序退出前刪除自身EXE
下面的 由gary nebbett寫就.gary nebbett乃是windows nt 2000 native api reference的作者.乃nt系統一等一的高手.下面就分析一些他的這段 這段 在process沒有結束前就將啟動process的exe檔案刪除了.int main int ar...
C 刪除程式自身 總結
偶然看到乙個可以自刪除的程式,於是了解下如何實現。然後整理如下 思路 在.net程式中,因為執行中的程式是受系統保護的,不能自己刪除自身的,所以自刪除的思路 在關閉本程式之前啟動新的程序開啟另乙個程式,呼叫這個程式來刪除原程式。然後再完成外部程序的銷毀。操作 方法一 程式中開啟新的程序,刪掉程式後,...
EXE程式的自刪除實現
程式的自刪除已經不是什麼新鮮的話題了,它廣泛運用於木馬 病毒中。試想想,當你的程式還在執行中 通常是完成了駐留 感染模組 它就自動地把自己從磁碟中刪掉,這樣一來,就做到了神不知鬼不覺,呵呵,是不是很cool呢?自刪除 self deleting 最早的方法是由 gary nebbett 大蝦寫的,太...