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

2016-02-19 20:50 1 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的虫虫大多都会。

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

延伸阅读
标签: 电脑入门
1、进入控制面板--程序--程序功能--打开或关闭windows功能--勾选 .Net FrameWork 3.5,包含2.0等版本,然后下载安装即可; 2、如果安装无效请确认用户软件使用需要的启动环境软件等,对应安装即可。 1.1 鼠标移动到桌面右下角,在弹出的界面选择控制面板(或者在metro界面鼠标移动到右下角,同样能出现此界面); 2.2 打开程序和功能; 2...
 作者:Victor Chen 来自:C++ 爱好者 http://www.cppfans.com -------------------------------------------------------------------------------- 程序介绍: 利用这个程序: 1.可以监视在你的电脑运行的程序, 把在你的电脑运行过的程序的时间和名字记录下来; 2.可以阻止你规定的禁用程序的执...
标签: PHP
掌握了PEAR::BenchMark,现在你已经知道如何测试你的代码,知道如何判断你的代码是快是慢,是哪一部份比较慢。那么接下来我要说的就是如何消灭或优化那部份慢的代码。 这一点上我个人最主要的经验只有两点,一是消除错误的或低效的循环;二是优化数据库查询语句。其实还存在一些其它的优化细节,比如str_replace比ereg_...
作者:火鸟 redbirdli@hotmail.com每一个编程爱好者,都希望自己的作品能为大家接受和喜爱,但我们的作品大多是简单的一个EXE文件的拷贝,既不需安装也没有删除程序,让人觉得只是程序而不是产品,以下我以Delphi 为例和大家交流一下程序组快捷方式建立、添加删除程序组中的删除项和程序的自删除等功能。 1.以下先来介绍建立程序组快捷方式...
怎么管理iphone后台运行的程序? 怎么管理后台运行的程序? 1. 按两下主屏幕按钮后,出现程序图标滑动图标便会出现更多的程序图标。多任务处理功能并没有通过牺牲电池续航以及前端软件性能为代价来实现的。有了它我们可以真正完成边收邮件、边听音乐、边建立文件的操作。 2. 出现图标后,按住某一图标便会出现关闭图标,关闭...

经验教程

789

收藏

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