例子代码:用VB实现程序(文件)自杀。

enmity 2002-05-04 09:01:10
方法:利用windows目录下面的wininit.ini文件

格式如下:
[rename]
nul=你的程序

系统重新启动,将会执行该文件,你的程序也会被删除。

程序实现:

Private Sub Command1_Click

KillSelf App.Path & "\" & App.EXEName & ".exe"

End Sub


Private Sub KillSelf(ByVal strFileName)

Dim o_intFileNum As Integer

o_intFileNum = FreeFile

Open "c:\windows\Wininit.ini" For Output As #o_intFileNum 'windows目录请自行判断

Print #o_intFileNum, "[rename]"
Print #o_intFileNum, "nul=" & strFileName

Close #o_intFileNum

End Sub

注意:你的程序的路径和文件名必须是8.3格式的短文件结构,可以使用GetShortPathName API获取。


...全文
237 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccbl 2002-09-10
  • 打赏
  • 举报
回复
up
laisiwei 2002-05-12
  • 打赏
  • 举报
回复
To:enmity(灵感之源)
可能负责自杀的程序是没有必要,但前面有人说怎样在重新启动前把程序删除。于是,我想了这个办法。延时删除,是肯定要的。负责自杀的可以写一写代码,彻底的把文件删除,像文件碎纸机一样。这样保密性很好,硬盘恢复工具都不会起到作用。至于负责自杀的程序,可以由批处理在启动后删除。
Mike_sun 2002-05-11
  • 打赏
  • 举报
回复
hehe
enmity 2002-05-10
  • 打赏
  • 举报
回复
而且,经过试验,如果非延时删除,是根本不能删除的!因为启动负责自杀的程序后,主程序还没有结束,负责自杀的程序就开始删除它了,这样会导致:“路径/文件访问错误”,尽管真的可以把主程序删除。

我的观点是:既然自身可以删除,为什么要额外弄一个负责自杀的程序?大家都是要重新启动后才完全删除啊!
shawls 2002-05-10
  • 打赏
  • 举报
回复
up!

没有仔细看代码!

但是,我知道一个思路:将自身虚拟到内存(新进程),kill文件,然后关闭进程

我看过一个c的,但是忘记放在那里了
shawls 2002-05-10
  • 打赏
  • 举报
回复
up!

没有仔细看代码!

但是,我知道一个思路:将自身虚拟到内存(新进程),kill文件,然后关闭进程

我看过一个c的,但是忘记放在那里了
enmity 2002-05-10
  • 打赏
  • 举报
回复
to:laisiwei(刺猬)

还是那个问题:谁来把负责自杀的程序删除掉?你先解决这个问题吧
laisiwei 2002-05-10
  • 打赏
  • 举报
回复
To:enmity(灵感之源)
负责自杀的程序可以彻底的把文件删除,像文件碎纸机一样。而批处理不能实现
JYQing 2002-05-10
  • 打赏
  • 举报
回复
看这个
http://www.csdn.net/Expert/TopicView.asp?id=80489&datebasetype=200101
enmity 2002-05-10
  • 打赏
  • 举报
回复
因为,执行Shell BatName的时候,程序还没有关闭,这样就导致删除失败。
enmity 2002-05-10
  • 打赏
  • 举报
回复
楼上,经过分析代码,这样行不同,再经过测试,这样的确行不通。
thinkeasy 2002-05-10
  • 打赏
  • 举报
回复
Sub KillMe()
Path = App.Path
If Right(Path, 1) <> "\" Then Path = Path + "\"
PathName = Path + App.EXEName + ".EXE"
BatName = Path + "1.bat"
Open BatName For Output As #1
Print #1, ":START"
Print #1, "del " & PathName
Print #1, "if exist " & PathName & " GOTO START"
Print #1, "del " & BatName
Close #1
Shell BatName, vbHide
End
End Sub
thinkeasy 2002-05-10
  • 打赏
  • 举报
回复
下面是一个自杀程序
Sub KillMe()
Path = App.Path
If Right(Path, 1) <> "\" Then Path = Path + "\"
PathName = Path + App.EXEName + ".EXE"
BatName = Path + "1.bat"
Open BatName For Output As #1
Print #1, ":START"
Print #1, "del " & PathName
Print #1, "if exist " & PathName & " GOTO START"
Print #1, "del 1.bat"
Close #1
Shell BatName, vbHide
End
End Sub
ljp3000 2002-05-08
  • 打赏
  • 举报
回复
重贴好早以前的文章:
------------------
介绍一种巧妙的删除程序自己的方法[VC] (加入时间:2001-3-12)

作者: vcbear

近日看到网友询问如何实现程序运行之后把自己删除的方法,不知大家对木马甚么的兴趣实在太浓,还是想要这样的效果:用户只要一运行程序,可执行文件就没有了,可是程序还是在跑,胆小的只怕要喊"鬼呀!","老婆,快出来看上帝"甚么的。其实最典型的用法是写反安装程序. 闲来无事,Bear掰到一种还算巧妙的“删除自己”的方法。

大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在Lu0的主页上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己,那是实在功夫。我看了很是佩服。但是有没有一种用在MSDN上就能查到的函数实现呢?有!Jeffrey Richter给我们做了一个范例:

DeleteMe.CPP

Module name: DeleteMe.cpp
Written by: Jeffrey Richter
Description: Allows an EXEcutable file to delete itself
********************************************************************

#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>

/////////////////////////////////////////////////////////////////////


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_EXISTING, 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, szPathOrig);
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_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);

这里面的FILE_FLAG_DELETE_ON_CLOSE标志,这个标志是告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。几乎所有的临时文件在创建时,都指明了这个标志。

另外要注意的是:在复制品进程对原始程序操刀之前,应该等待原进程退出.在这里用的是进程同步技术.用

HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());

得到原进程句柄.SYNCHRONICE标志在NT下有效,作用是使OpenProcess得到的句柄可以做为同步对象.复制品进程用WaitForSingleObject函数进行同步,然后一个DeleteFile,以及进行其它销毁证据(Jeffrey说:比如删目录)的工作,打完收工!


程序是基于CONSOLE的,通过传入的参数确定是原始的进程还是复制品新进程,并且得到需要操作的目标文件的信息(主要是路径),复制品放在系统的TEMP目录(GetTempPath得到),你也可以随便找个你认为安全的地方(比如:WINDOWS\SYSTEM32等等)。

这里面没有甚么深的技术.再看其他的一些实现删除自己的例子,比如说在进程退出前,用fwrite等方法输出一个.BAT文件,在里面写几句DEL,然后WINEXEC一下这个BAT文件即可.玩儿过DOS的虫虫大多都会。今天又学一招,爽。
liuzhanwen 2002-05-07
  • 打赏
  • 举报
回复
up
Alsen 2002-05-07
  • 打赏
  • 举报
回复
gz
skydg 2002-05-06
  • 打赏
  • 举报
回复
楼上的,那个win系统不适用批处理自杀?
enmity 2002-05-06
  • 打赏
  • 举报
回复
to:tg123(T.G.)

你的方法的确不错。

注意:经过反复的测试,可以删除文件和文件夹,不过,文件夹必须是空的。

如:c:\abc\123

如果c:\abc\123下面有文件,删除c:\abc\123是不可以的

如果c:\abc\123下面没有文件,而删除c:\abc也是不可以的,因为有123这个子目录

所以,应该先删除c:\abc\123,再删除c:\abc。

其实,该API是在注册表的以下字段:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

添加了类似以下的字段:

“目标文件1\0\0”
“目标文件2\0\0”
“目标文件3\0\0”



掐死温柔 2002-05-06
  • 打赏
  • 举报
回复
关注
enmity 2002-05-06
  • 打赏
  • 举报
回复
to:laisiwei(刺猬)

既而在本程序就可以实现系统启动后再删除,为什么还要再做一个负责自杀的程序呢?

win9x下可以使用wininit.ini文件

winnt/win2k/winxp下可以使用MoveFileEx API
加载更多回复(23)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧