#include
#include
/*
1.若是有文件的HANDLE打開,文件刪除就會失敗,因此,
CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的
硬編碼,對應於EXE的IMAGE.在缺省狀況下,OS假定沒有任何調
用會關閉IMAGE SECTION的HANDLE,而如今,該HANDLE被關閉了.
刪除文件就解除了文件對應的一個句柄.
2.因爲UnmapViewOfFile解除了另一個對應IMAGE的HANDLE,
並且解除了IMAGE在內存的映射.因此,後面的任何代碼都不可
以引用IMAGE映射地址內的任何代碼.不然就OS會報錯.而如今
的代碼在UnmapViewOfFile後則恰好沒有引用到任何IMAGE內的代碼.
*/
main()
{
printf("這是一個刪除自身的程序\n");
HMODULE hm = GetModuleHandle(0);
char buf[MAX_PATH];
GetModuleFileName(hm, buf, sizeof(buf));
CloseHandle((HANDLE)4);
__asm
{
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push hm
push DeleteFile
push UnmapViewOfFile
ret
}
return 0;
} 編碼