JohnChen分析了一下Gary Nebbett写的一段程序自删除的程序。是很精妙的一段代码,精妙之处在于其进程尚在,但可执行文件已经被删除了。
我前段时间也写了一段自删除代码,不过没有那么高深,只是利用了批处理的功能,在程序的最后调用我这个函数,就能够将自己删除。现在把函数代码贴出来。
void SelfDelete()
{
static char templ[] =
":Repeat\r\n"
"del \"%s\"\r\n"
"if exist \"%s\" goto Repeat\r\n"
"rmdir %s \r\n"
"del \"%s\"" ;
static const char tempbatname[] = "_uninsep.bat" ;
char modulename[MAX_PATH] ;
char temppath[MAX_PATH] ;
char folder[MAX_PATH] ;
GetTempPath(MAX_PATH, temppath) ;
strcat(temppath, tempbatname) ;
GetModuleFileName(NULL, modulename, MAX_PATH) ;
strcpy (folder, modulename) ;
char *pb = strrchr(folder, '\\');
if (pb != NULL)
*pb = 0 ;
HANDLE hf ;
hf = CreateFile(temppath, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
if (hf != INVALID_HANDLE_VALUE)
{
DWORD len ;
char *bat ;
bat = (char*)alloca(strlen(templ) +
strlen(modulename) * 2 + strlen(temppath) + 20) ;
wsprintf(bat, templ, modulename, modulename, folder, temppath) ;
WriteFile(hf, bat, strlen(bat), &len, NULL) ;
CloseHandle(hf) ;
ShellExecute(NULL, "open", temppath, NULL, NULL, SW_HIDE);
}
}