如何用 C++ 编写程序,使其在执行后会自行删除?
Posted
技术标签:
【中文标题】如何用 C++ 编写程序,使其在执行后会自行删除?【英文标题】:How to write a program in C++ such that it will delete itself after execution? 【发布时间】:2010-08-11 09:29:03 【问题描述】:【问题讨论】:
@Neil:这是个陷阱! 这样做似乎是不道德的。想不出为什么要让这样的东西在我的电脑上运行的充分理由。 如果他不得不问这个问题,他不可能写出好的病毒。为什么你们都这么偏执?也许它是一个安装程序存根? 通常,需要这个的程序是应该在执行之前删除的程序:) 卸载程序当然是正当理由。 【参考方案1】:这是 C 中的代码,执行后将删除可执行文件。
#include <Windows.h>
#include <strsafe.h>
#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")
void DelMe()
TCHAR szModuleName[MAX_PATH];
TCHAR szCmd[2 * MAX_PATH];
STARTUPINFO si = 0;
PROCESS_INFORMATION pi = 0;
GetModuleFileName(NULL, szModuleName, MAX_PATH);
StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
void main()
/* Do what you need */
/* Call this function at the very end of your program to delete itself */
DelMe();
【讨论】:
【参考方案2】:一些Methods
您也可以使用某种计划任务...
【讨论】:
好文章,“XP+ 的解决方案”真的很棒 新链接:Self-deleting Executables 和 Self deleting executables【参考方案3】:在 Unix 上,只需对可执行文件调用 unlink(2)。
在 Windows 上,您需要第二个过程来帮助您。 st0le 的响应似乎是为了取消链接 DLL,但对于可执行文件,您需要启动第二个进程或使用现有进程,然后终止您的可执行文件并让第二个进程执行删除。
一个非常简单的方法是使用 cmd.exe 来帮助。
使用任何其他进程的推测方法可能是在另一个进程中分配一些内存并将要删除的文件名放在那里,然后使用 CreateRemoteThread() 在远程进程中创建一个挂起的线程,入口点为 DeleteFile带有指向您分配的内存的指针的参数。然后退出你的进程,线程挂起计数应该减少,然后应该调用 DeleteFile 来删除你的文件。
问题:远程进程内存泄漏,乱七八糟。
一种更简单的方法可能是使用 st0le 的回答中的技术获得一个支持 DLL。
【讨论】:
【参考方案4】:std::remove(argv[0])
在main中return之前可以做到。
【讨论】:
您实际上不能 100% 确定argv[0]
包含可执行文件的正确路径。应该这样做,但没有强制执行,并且在某些情况下,由于某种原因,它被破坏了。
这个答案不完整,也不准确。尽管如此,作为最简单(和幼稚)的方法,完整的答案应该简要说明它,在哪些情况下可行或不可行,也许是为什么。【参考方案5】:
但是有一种方法可以在执行后自行删除文件,因为每个卸载程序都会卸载由它安装的软件并删除最后一个剩余的文件,即它本身,这样除了一些文件之外,我们的硬盘中不会保留任何文件注册表项,无论其安装在什么平台上。
【讨论】:
【参考方案6】:对于 Windows 试试这个。它基本上是启动一个循环直到销毁成功的 .bat 文件:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
【讨论】:
【参考方案7】:我最初发布了这个解决方案here。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
char* process_name = argv[0];
char command[256] = "start /min cmd /c del ";
strcat(command, process_name);
printf("Attempting to delete self...\n");
system(command);
return 0;
通常,尝试使用system
调用命令提示符来删除可执行文件是行不通的,因为生成的命令提示符是system
执行并等待返回状态的子进程。
此方法调用系统在自己的线程上启动命令提示符进程。
/min
参数以“隐藏”方式启动进程。/c
参数为生成的命令提示符提供参数。
我知道这是一个旧线程,但我希望将来能来这里的人。
【讨论】:
【参考方案8】:这是一个足够合理的问题,但您似乎不了解可执行文件的工作原理。执行将程序放在内存中,因此删除磁盘文件是微不足道的(前提是您不删除运行时依赖项)。
【讨论】:
如果在内存中执行,为什么我(在windows中)程序正在运行时不能删除可执行文件? 执行将程序的部分放在内存中 - 许多页面可能会留在磁盘上以供稍后加载,这就是大多数操作系统不允许您删除文件的原因代表一个正在执行的进程。 啊,我明白了。这主要是我认为会发生的事情。 -1 "所以删除磁盘文件很简单" 这是不正确的。程序在linux上可以很容易地删除自己(如果它有足够的权限),但是在windows上,当前正在运行的程序的文件在程序终止之前不能被删除。 Windows(至少,可能还有其他)不会将可执行文件的内容复制到内存中,它会将文件映射到内存中,然后加载页面按需提供。以上是关于如何用 C++ 编写程序,使其在执行后会自行删除?的主要内容,如果未能解决你的问题,请参考以下文章
如何用普通 C++ 编写一个执行我的 javascript 的 IE BHO