通过批处理实现自删除程序的小改进
网上关于如何实现自删除程序的文章很多。有通过汇编实现的,有通过脚本实现的,有通过批处理实现的,有通过文件的FILE_FLAG_DELETE_ON_CLOSE标志实现的,还有通过远程线程实现的,总之方法很多。
脚本实现的方法,由于某些机器的Windows Script Host有问题,并不可靠。汇编实现的方法,某些时候不能删除程序。通过FILE_FLAG_DELETE_ON_CLOSE标志或者远程线程都太麻烦。
通过批处理实现比较简单,很多文章中都是介绍生成一个批处理文件,其实完全没有必要生成批处理文件。使用下面的命令即可:
for /l %a in (1,1,10) do (if exist a.exe (del a.exe & ping 127.0.0.1) else exit)
由于没有好的延时方法,只好通过ping127.0.0.1来延时。
函数实现:
int delete_self(const char* image)
{
unsigned int len = strlen(image)*2 + 128;
char *cmd = (char*)calloc(len, sizeof(char));
if (!cmd) return 0;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
int iret = _snprintf(cmd, len-1,
"cmd /c for /l %%a in (1,1,10) do (if exist /"%s/" (del /"%s/" & ping 127.0.0.1) else exit)",
image, image) ;
{
free(cmd);
return 0;
}
if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
free(cmd);
return 0;
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
free(cmd);
return 1;
}