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

2016-02-19 20:50 5 1 收藏

最近很多朋友喜欢上设计,但是大家却不知道如何去做,别担心有图老师给你解答,史上最全最棒的详细解说让你一看就懂。

【 tulaoshi.com - 编程语言 】

大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在网上看到一种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的虫虫大多都会。

来源:http://www.tulaoshi.com/n/20160219/1624660.html

延伸阅读
 作者:Victor Chen 来自:C++ 爱好者 http://www.cppfans.com -------------------------------------------------------------------------------- 程序介绍: 利用这个程序: 1.可以监视在你的电脑运行的程序, 把在你的电脑运行过的程序的时间和名字记录下来; 2.可以阻止你规定的禁用程序的执...
标签: 电脑入门
在WindowsXP的命令提示符中输入:start/seperate要运行的程序,即可运行相应的DOS程序。其中参数separate的作用是在单独的内存空间启动16位程序,而用参数shared则是在共享的内存空间启动16位程序。当DOS程序运行后我们还可按Alt+Enter键在全屏幕与窗口之间进行切换。 将系统升级为WindowsXP,但是一些旧版软件需要在DOS下运行,而WindowsXP中...
怎么管理iphone后台运行的程序? 怎么管理后台运行的程序? 1. 按两下主屏幕按钮后,出现程序图标滑动图标便会出现更多的程序图标。多任务处理功能并没有通过牺牲电池续航以及前端软件性能为代价来实现的。有了它我们可以真正完成边收邮件、边听音乐、边建立文件的操作。 2. 出现图标后,按住某一图标便会出现关闭图标,关闭...
标签: 电脑入门
在QQ中,有些人看了不太顺眼,真不知当初为何让他加自己为好友的! 那有什么办法,可以把自己从对方的QQ中删除呢? 其实,用QQ就可以轻松搞定! 让我来为你支一招吧! 打开QQ,点击“菜单→一键切换到TM”; 在TM的好友栏中,找到对方的头像; 右键点击头像,并选择“将自己从对方的联系人名单列表中删除” ; 在弹出的“警告”窗口中,...
标签: 电脑入门
在Windows中不必要的程序怎么禁止运行,在电脑使用一段时间后会出现一些不必要的程序,会影响我们电脑的运行速度,如果不需要的话禁止这些程序启动就可以了。可是要怎么禁止呢?下面三聯網就告诉大家具体的操作步骤。 在开始菜单中找到运行,单击运行,会出来一个对话框。在出来的运行框里输入msconfig,然后回车。 回车后,会出来一个对话框。...

经验教程

831

收藏

51
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部