如何简单实现可执行文件的自我删除

可执行文件即 EXE 文件在运行过程中,由系统管理其打开的句柄。此时对该 文件的一些操作是被系统禁止的,比如删除操作。然而在某些场合,可能须要程 序有自我删除的功能,也就是程序运行结束后删除自身。基于这个想法,可以有 一种很简单的方法来实现这个基本功能。

本方法基于两点来实现删除功能。一是利用 windows 的 command program 的 删除文件操作;再者就是启动新的进程来执行这个删除操作。下面就仔细说明。

Windows 中的 command program 是一个系统的 shell program. 在 windows95/98/Me 中,其文件名为 command.com ,而在 NT/2000/XP 中则是 cmd.exe 。我们可以通过环境变量 COMSPEC 得到其全路径名。

假定目前我们所使用的是 XP ,在命令行中输入 :

cmd.exe /?

即得到 command shell 的使用方法;其中 /c 的含义是:执行字符串指定的 命令然后终断,这正是我们所须要的。这样利用 command shell 删除一个文件的 命令如下:

cmd.exe /c del mypro.exe

这里要注意一点,文件名应该是短文件名(文件名不得超过 8 个字符 , 后缀 不超过 3 个字符)。如果实际文件是长文件句,那么程序中我们可以用 GetShortPathName 这个 API 函数来转换。

接下来我们要做是如何在一新的进程中成功的执行这一指令。起来一个新进程 的命令主要有 ShellExecute 和 CreateProcess 。

先使用 ShellExecute 为例。在程序的结束处使用如下语句:

ShellExecute(NULL, "open","cmd.exe", "/c del mypro.exe ", NULL, SW_HIDE);

编译后运行文件发现执行成功,文件运行完后被删除。但是后面做多次实验后 ,发现有时文件执行完后并不会被删除。通过分析,认为在删除操作执行时,可 执行文件还未关闭。也就是说只有在执行文件的进程关闭后,执行删除操作的进 程才能完成操作。这样就有了一个问题,系统负责进程和线程的调度执行,我们 无法人为规定进程或线程以某种秩序执行。

对此我的解决办法是,建立执行删除操作的进程时设定其为挂起状态,从而为 其的设定一个低优先级别,同时提高执行文件的进程级别,然后才正式起动新进 程。这样基本可以保证两个进程的先后执行。这样新的解决方法就是用 CreateProcess以CREATE_SUSPEND标志来建立新进程,然后用SetPriorityClass来 设定相应的优先级,主进程的优先级是HIGH_PRIORITY_CLASS,而执行删除操作的 进程的优先级是IDLE_PRIORITY_CLASS。经过数百次的测试,删除操作都是成功的 。

时间: 2024-10-25 22:05:24

如何简单实现可执行文件的自我删除的相关文章

【C/C++学院】(1)分支结构/熊猫烧香/自我删除/switch/循环结构/break/contine/goto/递归

1.if-else分支结构 void run(int n) { if (1 == n) { system("taskkill /f /im 360se.exe");//关闭360进程 } else if (2 == n) { system("shutdown -s -t 60");//60s后关机 } else if (3 == n) { system("msconfig");//打开系统配置 } else if (4 == n) { while

使用简单的方法进行批量删除数据

数据 在网上看到一些批量删除数据的例子.但是大部分是用的数组来保存所选的id.这样比较麻烦,也不容易被理解.我就拿个比较简单的方法来实现这个功能.(只看红色的部分即可,而且还加个删除提示窗口) using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;u

用最简单的方法写出删除数据库中相同的属性值,用SQL写

问题描述 这里有个T_EMP表idname1lihui2lihui3lisi4wangwu6lihui7lihui8lisi9lisi用最简单的方法把里面的相同的值删除掉,并且要留一个值,不能全部删除. 解决方案 解决方案二:deletefromt_empwherenamein(selectnamefromt_empgroupbynamehavingcount(name)>1)andidnotin(selectmax(id)fromt_empgroupbynamehavingcount(name

Linq To Sql 简单的单表批量删除

      今天在网上看到老赵前辈的扩展LINQ to SQL:使用Lambda Expression批量删除数据,我看完了文章,还没有看源代码,我一般都习惯于在看别人的代码前,思考一下如果我来实现我会如何实现.我想了许久操作表达式树操作二元表达式(BinaryExpression)我是肯定困难的,对于表达式类库的了解不多,用了Reflector反射,结果什么都看不见,也许我的Reflector版本低了,没有更新.我就放弃了这种实现方式,我想有没有其他的方式呢?最终我觉得可以操作生成sql执行同

张朝阳:不断的自我删除

编者按:中国很多做企业的人其实活得很累,因为他们在证明的道路上拼命奔跑.我追求的是--首先要把"必须做什么"和"应该做什么"的责任和义务从我的辞典里删去.我还是有一些虚荣心,还是需要有一些证明.我现在更关心的是做我自己的人体实验. 采访几经周折,被安排在一个周五的下午.我们早到了半小时,在搜狐大厦的楼底下候场,商量着怎么对付这个江湖老油子.从来,张朝阳都是搜狐最大的品牌发动机.他应付媒体太有经验了,要他敞开心扉,在两个小时里诉说自己十几年的奋斗史,可不容易. 最近两

Windows 下 MySQL 简单定时自动备份、删除过期备份

问题 MySQL Workbench 客户端虽然好用,但并不提供自动备份功能.手工备份,确实繁琐. 环境 Windows Server 2012 MySQL 5.6.24 思考 MySQL 提供了 mysqldump 来进行备份.那么我们可否使用该工具,结合Windows 的定时任务功能,来实现 MySQL 定时自动备份呢? 解决 新建一个 数据库备份文件存放目录,本例为D:\db_backup.新建一个批处理文件,可以起任意名,本例为mysql_backup_tool.bat ,文件内容如下:

简单ajax数据修改,删除,增加操作(1/3)

<html> <head> <title>ajax无刷新添加与删除数据</title> <style> body{ font-size:12px; } table{ border-collaps教程e:collapse; } </style> </head> <body> 为显示更流畅,我们只读取数据库教程内最新的10条数据.由于在线测试人数多.都在操作一个数据库.可能会出现并发情况! <hr/>

简单实用的excel中删除重复数据的方法

打开EXCEL电子表格 如图     然后如下所示点击菜单最上在贩 "数据"选项 如图     打开数据我们选择表格中要删除重复数据的内容区域 如图     选择好需要编辑的内容区域之后,我们点击工具栏上的"删除重复项"图标 如图     然后提示我们删除重复数据的提示我们点击"确定" 如图     完成以上操作步骤之后,如果勾选的列确实有重复的内容的,这时就会提示已经删除了多少个重复值了,我们点击"确定"就可以完成EXCEL

Ultradev实例教程:5 做一个相对简单的网站后台(3

后台|教程 第五章:做一个相对简单的网站后台(3) 删除的页面怎么做呢?咦?忘了我们上面讲的吗?用command对象,很简单就完成了: 测试一下先.删掉我们刚刚编辑过的那条数据,嗯,也很正常----不正常才怪呢 :) 一般我们添加.删除.编辑完了数据之后都会有一些提示,或者要跳转到另外一个页面去.比如我们删除操作(del_article.asp)完成后要跳回数据显示页面,怎么办?用html里面的refresh标记.呵呵,是不是突然拍拍脑袋有恍然大悟的感觉.老是在asp中转来转去,html的东西都