运行中程序删除自己的方法
众所周知,一般程序在运行时,可执行文件本身是受操作系统保护的,无法通过重写来访问,更不要说在它还在运行的时候就自行删除了。我在网上看到一个UNDOCUMENT的方法,可以通过改变系统底层的文件访问方式来删除自己。但是有没有一个函数实现可以在MSDN上找到呢?答案是肯定的。这里有一个例子:
删除我。卡片打印处理机(Card Print Processor的缩写)
模块名称:DeleteMe.cpp
作者:Jeffrey Richter
说明:允许可执行文件删除自身
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include
# include
# include
/////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE h,HINSTANCE b,LPSTR psz,int n) {
//这是原EXE还是克隆EXE?
//如果命令行参数为1,这是原始EXE
//如果命令行参数> 1,这是克隆EXE
if (__argc == 1) {
// Original EXE: Spawn clone EXE删除该EXE
//将该可执行映像复制到用户的临时目录中
TCHAR szPathOrig[_MAX_PATH],szpath clone[_ MAX _ PATH];
GetModuleFileName(NULL,szPathOrig,_ MAX _ PATH);
GetTempPath(_MAX_PATH,szpath clone);
GetTempFileName(szpath clone,__TEXT("Del "),0,szpath clone);
copy file(szpath rig,szPathClone,FALSE);
//* * * Note * * *:
/使用file _ flag _ delete _ on _ close
handle FILE = create FILE打开克隆exe(szpath clone,0,file _ share _ read,null,OPEN_EXISTI
NG,FILE _ FLAG _ DELETE _ ON _ CLOSE,NULL);
//生成克隆EXE,并向其传递我们EXE的进程句柄
//以及原始EXE文件的完整路径名。
TCHAR szCmdLine[512];
HANDLE hProcessOrig = open process(SYNCHRONIZE,TRUE,GetCurrentProcessId());
wsprintf(szCmdLine,__TEXT("%s %d \"%s\ " "),szPathClone,hProcessOrig,szPat
hOrig);
startup info si;
ZeroMemory(&si,sizeof(si));
si . CB = sizeof(si);
进程_信息pi;
CreateProcess(NULL,szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,& pi);
close handle(hProcessOrig);
close handle(hfile);
//这个原始进程现在可以终止了。
}其他{
//克隆EXE:当原EXE终止时,删除它
HANDLE hProcessOrig =(HANDLE)_ ttoi(_ _ targv[1]);
WaitForSingleObject(hProcessOrig,INFINITE);
close handle(hProcessOrig);
delete file(_ _ targv[2]);
//在此插入代码以删除子目录(如果需要)。
//系统会自动删除克隆EXE
//因为是用FILE _ FLAG _ DELETE _ ON _ CLOSE
}
return(0)打开的;
}
这个程序的想法很简单:难道不能在运行时删除它自己吗?好的,那么程序会先克隆自己,用副本启动另一个进程,然后自己运行完,那么原来的EXE文件就不受系统保护了。这时,新进程就会像杀手锏一样删除原来的EXE文件,继续完成程序的其他功能。
新流程运行后,副本会自动删除。这是另一个值得介绍的招数。注意:
//使用FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = create FILE(szpath clone,0,FILE_SHARE_READ,NULL,OPEN_EXISTIN
G,FILE _ FLAG _ DELETE _ ON _ CLOSE,NULL)打开克隆EXE
里面的FILE_FLAG_DELETE_ON_CLOSE标志告诉操作系统,当这个文件相关的所有句柄都关闭时(包括上面CREATEFILE创建的句子),删除这个文件。几乎所有的临时文件在创建时都有这个标志。此外,需要注意的是,在副本进程操纵原程序之前,应该等待原进程退出。这里使用了进程同步技术。使用handle hprocessorig = open process(synchronize,true,getcurrentprocessid());获取原始进程的句柄。SYNCHRONICE标志在NT下有效,它的作用是使OpenProcess获得的句柄作为同步对象。复制过程与WaitForSingleObject函数同步,然后将执行DeleteFile和其他销毁证据的工作(如删除目录)。
程序基于CONSOLE,通过传入的参数判断是原进程还是复制的新进程,并获取要操作的目标文件的信息(主要是路径)。副本放在系统的TEMP目录下(通过GetTempPath获得),你也可以找到任何你认为安全的地方(例如:Windows\SYSTEM32等。).这里面没有什么高深的技术。再来看看其他如何删除自己的例子。比如在进程退出之前,用fwrite等方法输出一个. BAT文件,在里面写几个DEL字,然后WINEXEC就可以点击这个BAT文件了。大多数玩过DOS的bug都会。
0条评论