运行中程序删除自己的方法

运行中程序删除自己的方法,第1张

运行中程序删除自己的方法,第2张

众所周知,一般程序在运行时,可执行文件本身是受操作系统保护的,无法通过重写来访问,更不要说在它还在运行的时候就自行删除了。我在网上看到一个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都会。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 运行中程序删除自己的方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情