JohnChen分析了一下Gary Nebbett寫的一段程式自刪除的程式。是很精妙的一段程式碼,精妙之處在於其進程尚在,但可執行檔已經被刪除了。
我前段時間也寫了一段自刪除程式碼,不過沒有那麼高深,只是利用了批次的功能,在程式的最後呼叫我這個函數,就能夠將自己刪除。現在把函數程式碼貼出來。
void SelfDelete()
{
static char templ[] =
":Repeatrn"
"del "%s"rn"
"if exist "%s" got Repeatrn "%s"" ;
static const char tempbatname[] = "_uninsep.bat" ;
char modulename[MAX_PATH] ;
char temppath[MAX_PATH] ;
char folder[MAX_PATH] ; ;
strcat(temppath, tempbatname) ;
GetModuleFileName(NULL, modulename, MAX_PATH) ;
strcpy (folder, modulename) ;
char *pb = strormfolder, '
*pb = 0 ;
HANDLE hf ;
hf = CreateFile(temppath, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMALUE, N7_NOAL, N8 DWORD len ;
char *bat ;
bat = (char*)alloca(strlen(templ) +
strlen(modulename) * 2 + strlen(temppath) + 20) ;
wsprintf(bat, templ, modulename, modulename, der, modulenames) ;
WriteFile(hf, bat, strlen(bat), &len, NULL) ;
CloseHandle(hf) ;
ShellExecute(NULL, "open", temppath, NULL, NULL, SW_HIDE);
);