如何让我的.NET应用程序自行擦除?

Max*_*sky 23 .net c# windows self-destruction delete-file

如何让我的C#app擦除自身(自毁)?以下是我认为可行的两种方式:

  • 提供另一个删除主程序的程序.但是这个删除程序是如何被删除的呢?
  • 创建一个等待几秒钟然后删除文件的CMD进程.在这几秒钟内,您关闭应用程序.

这两种方法似乎效率低下.我觉得有一些内置的标志或Windows中允许这样的东西.我该怎么办?另外,您能提供一些示例代码吗?

更新:感谢您的所有答案!我要去尝试一下,看看能给我带来什么.

首先,有些人问我为什么要我的应用程序这样做.这就是答案:几天前,我读了Joel Spolsky在他的博客上发布的Project Aardvark规范,并提到客户端应用程序会在远程会话后删除自己.我想知道它是如何工作的,以及如果我需要这样做,我可以完成这样的壮举.

以下是对建议内容的一点概述:

  • 创建一个注册表项,告诉Windows在重新启动时删除该文件
  • 使用ping命令启动CMD等待几秒钟然后删除该文件

当然,这些都有其缺点,如评论中所述.

但是,下面概述的这种方法是否有效?

有两个可执行文件:Program.exe和Cleaner.exe.前者是程序本身,后者是删除Program.exe及其自身的应用程序(如果它被加载到内存中,我将要解释).Program.exe(具有依赖关系)是否可以将所有没有任何依赖关系的Cleaner.exe 加载到内存中并运行它?

如果可以,可以将Cleaner.exe打包到Program.exe中,加载到内存中,然后运行?

Ant*_*lev 19

有一个MoveFileEx API,当给出一个MOVEFILE_DELAY_UNTIL_REBOOT标志时,它将在下次系统启动时删除指定的文件.

  • @FWFD:很好,很容易.他们还可以删除相应的注册表项(这是存储下次重新启动时删除该文件的说明). (2认同)

Bob*_*bby 10

关于这个主题有一篇很棒的CodeProject文章.

编辑:基本上它是一个简单的cmd调用,它会在几秒钟后删除指定的文件.

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath); 
Application.Exit();
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是"等待一秒然后删除"的方法(来自OP的第二个子弹). (7认同)

Joh*_*lla 7

只要您需要在机器上存在物理存在,您将永远无法保证这将起作用.例如:

  • 如果应用程序在您尝试删除资源时未能及时发布资源,该怎么办?发生错误,应用程序仍然存在.
  • 从AV角度来看,一个应用程序启动另一个应用程序然后删除第一个应用程序的行为非常可疑.您可能会在用户的计算机上触发防御,这可能会导致尝试终止原始应用程序的进程失败.
  • 如果您在重新启动时执行删除文件之类的操作,如果用户在两者之间移动文件或进行复制,该怎么办?它不再是原来的位置,应用程序仍然存在.

如果您的应用程序需要此级别的安全性,请考虑将其托管在您控制的计算机上(例如,通过提供Web服务并让存根客户端以这种方式访问​​它).

在某种程度上相关的说明中,人们也倾向于推测某人的动机(1)需要在某人的机器上进行实体存在,以及(2)想要删除应用程序存在的证据.