一個刪除自身的程序源代碼

#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;
編碼

相關文章
相關標籤/搜索