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

521999叶子

521999叶子

2016-02-19 20:50

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。
大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在网上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己。但是有没有一种用在MSDN上就能查到的函数实现呢?答案是肯定的。 !-- frame contents -- !-- /frame contents -- 下面请看一个范例:
  
  
  
   
  DeleteMe.CPP
   
  Module name: DeleteMe.cpp
  Written by: Jeffrey Richter
  Description: Allows an EXEcutable file to delete itself
  **************************************************/
   
  #include
  #include
  #include
   
  /////////////////////////////////////////////////
   
  int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n) {
   
  // Is this the Original EXE or the clone EXE?
  // If the command-line 1 argument, this is the Original EXE
  // If the command-line 1 argument, this is the clone EXE
   
  if (__argc == 1) {
   
  // Original EXE: Spawn clone EXE to delete this EXE
  // Copy this EXEcutable image into the user''s temp Directory
   
  TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
  GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
  GetTempPath(_MAX_PATH, szPathClone);
  GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
  CopyFile(szPathOrig, szPathClone, FALSE);
   
  //***注重了***:
  // Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
  HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTI
  NG, FILE_FLAG_DELETE_ON_CLOSE, NULL);
   
  // Spawn the clone EXE passing it our EXE''s process handle
  // and the full path name to the Original EXE file.
  TCHAR szCmdLine[512];
  HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());
  
  wsprintf(szCmdLine, __TEXT("%s %d "%s""), szPathClone, hProcessOrig, szPat
  hOrig);
  STARTUPINFO si;
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  PROCESS_INFORMATION pi;
  CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
  CloseHandle(hProcessOrig);
  CloseHandle(hfile);
   
  // This original process can now terminate.
  } else {
   
  // Clone EXE: When original EXE terminates, delete it
  HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
  WaitForSingleObject(hProcessOrig, INFINITE);
  CloseHandle(hProcessOrig);
  DeleteFile(__targv[2]);
  // Insert code here to remove the subdirectory too (if desired).
   
  // The system will delete the clone EXE automatically
  // because it was opened with FILE_FLAG_DELETE_ON_CLOSE
  
   }
  return(0);
  }
   
   
    这一段程序思路很简单:不是不能在运行时直接删除本身吗?好,那么程序先复制(CLONE)一个自己,用复制品起动另一个进程,然后自己结束运行,则原来的EXE文件不被系统保护.这时由新进程作为杀手删除原来的EXE文件,并且继续完成程序其他的功能。
  
    新进程在运行结束后,复制品被自动删除。这又是值得介绍的一个把戏了,注重:
  
  // Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
  HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,OPEN_EXISTIN
  G, FILE_FLAG_DELETE_ON_CLOSE, NULL);
  
    这里面的FILE_FLAG_DELETE_ON_CLOSE标志,这个标志是告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。几乎所有的临时文件在创建时,都指明了这个标志。另外要注重的是:在复制品进程对原始程序操刀之前,应该等待原进程退出.在这里用的是进程同步技术.用HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());得到原进程句柄.SYNCHRONICE标志在NT下有效,作用是使OpenProcess得到的句柄可以做为同步对象.复制品进程用WaitForSingleObject函数进行同步,然后一个DeleteFile,以及进行其它销毁证据(比如删目录)的工作,一切就完事了。
   
    程序是基于CONSOLE的,通过传入的参数确定是原始的进程还是复制品新进程,并且得到需要操作的目标文件的信息(主要是路径),复制品放在系统的TEMP目录(GetTempPath得到),你也可以随便找个你认为安全的地方(比如:WINDOWSSYSTEM32等等)。这里面没有甚么深的技术.再看其他的一些实现删除自己的例子,比如说在进程退出前,用fwrite等方法输出一个.BAT文件,在里面写几句DEL,然后WINEXEC一下这个BAT文件即可.玩儿过DOS的虫虫大多都会。

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
运行中程序删除自己的方法

Win7系统中程序无法正常运行怎么办

电脑网络
Win7系统中程序无法正常运行怎么办

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

使用root权限运行自己所编译程序的解决方法

编程语言 网络编程
使用root权限运行自己所编译程序的解决方法

ASP.Net中程序构架与程序代码的分离

电脑网络
ASP.Net中程序构架与程序代码的分离

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何获取自己在程序中运行的外部EXE的Handle?

编程语言 网络编程
如何获取自己在程序中运行的外部EXE的Handle?

检测程序运行的命令

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
检测程序运行的命令

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

qq网名女生超拽霸气 £歇斯★底里﹌

qq网名女生超拽霸气 £歇斯★底里﹌

C++Builder动态更改自定义打印纸张

C++Builder动态更改自定义打印纸张
下拉加载更多内容 ↓