下面的**由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...
VB刪除自身
注意 這個 不要在vb的ide環境中執行.否則將刪除vb6.exe api getmodulefilename 獲取當前程序已載入模組的檔案的完整路徑,該模組必須由當前程序載入。如果想要獲取另乙個已載入模組的檔案路徑,可以使用getmodulefilenameex函式 private declare...
程序退出碼
目錄 description 如何檢視程序退出碼 分析退出碼 a.正常退出 b.異常退出 對異常的程序退出碼進行分析 關於訊號的具體分析 linux 下程序的退出分為正常退出和異常退出兩種 1.正常退出 a.在main 函式中執行return。b.呼叫exit 函式 c.呼叫 exit 函式 2.異...