文件自销毁的一种方法
这是一篇有关EXE文件自销毁的短文,与大家一起分享.
本文中的EXE文件自销毁是指一个exe文件在自身被关闭后删除自己的操作(并且不出现在回收站里).我们知道,当一个exe文件处于被打开运行的状态时,我们不能通过普通的方法删除它,当我们通过:鼠标右键删除/直接拖拽进回收站/使用cmd删除时,操作系统会提示无法删除该文件.这也是我们在编程序时无法通过向程序中加入kill app.path & ”/” & app.EXEname & ”.exe” (VB6.0代码)来实现删除自己,例如下面这个函数:
Private Fuction Example() as integer
Kill App.path & ”/” & App.EXEname & ”.exe”
END
End Function
该函数试图使用Kill命令删除自身文件然后再关闭自身进程.
但由于操作系统会在内存中开辟一块空间用来映射该可执行文件的信息,以来保护文件,所以当我们试图在其处于运行状态时删除其文件便被操作系统禁止.国外的专家早已用很专业的方式绕开了这一障碍,但这里我们介绍一下非专业但同样能达到效果的方法.
由于exe文件在处于运行状态时无法删除自己,而文件关闭后又不可能再执行上面的删除函数,那么我们可以利用操作系统的一个特点来帮助我们解决这一问题.我们可以在文件关闭前调用CMD的删除命令,用CMD来删除exe文件.采用这种方法是由于CMD的执行命令速度需要几毫秒(CMD自身因素,不受机器快慢因素影响),而在相应的删除命令执行前我们的程序已经关闭.
但在实际应用中出现了一个问题,先看一下VB的代码:
Private Fuction Example() as integer
Dim Del_Command as string
DEL_Command=”del “ & App.path & ”/” & App.EXEname & ”.exe”
Shell “cmd ” & Del_Command
End
End Function
函数试图通过在执行End命令关闭自身前向CMD发送删除文件命令,来达到延时删除自身操作,但CMD无法完成这个操作,命令总是传送不到CMD里,我正在查找这个原因.
所以,我们只能对上述方法进行衍生.具体代码如下:
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Dim shortpath ,del_command as string
Private Sub Form_Load()
shortpath = Space(255)
GetShortPathName(App.path, shortpath, 255)
del_command=”del “ & shortpath & “/” & App.EXEname & “.exe”
Open "f:/temp.bat" For Output As #1
Print #1, del_command
Close #1
Open "f:/ temp.bat" For Append As #1
Print #1, "del f:/ temp.bat"
Close #1
Shell "f:/ temp.bat"
End
End Sub
实现过程:
1.程序自动在指定位置新建一个.bat批处理文件,比如”F:/data/ temp.bat”.
2.将被赋值后的del_command变量 和 字符串 “del D:/data/example.bat” 分两行写入bat文件.
3.调用temp.bat.并关闭exe进程.
解释补充:
1. 通过向bat文件写入del_command变量来实现删除exe文件.
2. 通过向bat文件写入字符串 “del D:/data/example.bat”来实现删除bat文件.
3. 被CMD删除的exe文件不会被放入回收站.
4. bat文件不是可执行文件,即使处于打开状态也会被CMD删除,同样不会被放入回收站.
5. 程序中调用API函数获得当前文件的段路径.
6. 需要用space(255) 来初始化shortpath,是其在作为参数被API 函数调用前被分配内存地址.
7. space(255)中的255使得shortpath空间足够大,以容下短路径.
8. API函数的最后一个参数用于指定缓冲区大小,该缓冲区用来指定shortpath空间拿出多大空间来存放短路径.所以可以直接设该缓冲区大小为255,使其足够大,如果不够大,则API不会获取短路径.这时可以查看API的返回值,该值为整形数据,并给出了短路径所需缓冲区的大小.
9. 注意CMD的del关键字令后有一个空格将它与后面的文件路径阁开.
注:这个方法的根本原理就是CMD的延时删除特点.
我的表达能力不好,以后继续锻炼.