文件自销毁的一种方法

文件自销毁的一种方法

 

这是一篇有关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.       注意CMDdel关键字令后有一个空格将它与后面的文件路径阁开.

 

:这个方法的根本原理就是CMD的延时删除特点.

 

我的表达能力不好,以后继续锻炼.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值