自删除代码

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);
 }
}

 

JohnChen的分析见原文:

http://blog.youkuaiyun.com/byxdaz/archive/2005/11/26/537322.aspx

 



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=550029


 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值