進程退出前刪除自身EXE

來源:互聯網
上載者:User

下面的代碼由Gary Nebbett寫就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系統一等一的高手.下面就分析一些他的這段代碼.
這段代碼在PROCESS沒有結束前就將啟動PROCESS的EXE檔案刪除了.
int main(int argc, char *argv[])
{
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm {
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
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不被刪除.)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.