如何用C++编写一个程序,使其执行后自动删除?

问题描述 投票:0回答:9

如何用C++编写一个程序,使其在执行后自动删除?

c++
9个回答
30
投票

这是 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();
}

6
投票

在 Unix 上,只需对可执行文件调用 unlink(2)。

在 Windows 上,您需要第二个进程来帮助您。 st0le 的响应似乎是取消链接 DLL,但对于可执行文件,您需要启动第二个进程或使用现有进程,然后终止您的可执行文件并让第二个进程执行删除操作。

一个非常简单的方法是使用 cmd.exe 来提供帮助。

使用任何其他进程的推测方法可能是在另一个进程中分配一些内存,并将要删除的文件名放在那里,然后使用 CreateRemoteThread() 在远程进程中创建一个挂起的线程,其入口点为 DeleteFile,其指向您分配的内存的指针的参数。然后退出你的进程,线程挂起计数应该递减,然后应该调用DeleteFile来删除你的文件。

问题:远程进程内存泄漏,混乱。

一种更简单的方法可能就是使用 st0le 答案中的技术获得一个支持 DLL。


5
投票

一些方法

您还可以使用某种计划任务...


3
投票

std::remove(argv[0])
在返回main之前就可以做到。


1
投票

对于 Windows 试试这个。它基本上是启动一个循环的 .bat 文件,直到销毁成功:

http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file


0
投票

但是,有一种方法可以在执行后自行删除文件,因为每个卸载程序都会卸载其安装的软件,并且还会删除最后剩余的文件,即本身,这样除了一些注册表项之外,我们的硬盘中将不会残留任何文件无论安装的是哪个平台。


0
投票

我最初在这里发布了这个解决方案。

#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
参数为生成的命令提示符提供参数。

我知道这是一个旧线程,但我希望那些将来来到这里的人。


0
投票

如果您使用的是 Windows,我发现这是最简单、最直接的方法。我自己在这个线程上搜索这个内容,最终找到了我自己的方法,通过 标头中的 ShellExecute() 来实现它。

#include <shellapi.h>

int main()
{
    //run your normal code

    //just before main return exit, run this:
    ShellExecute(0, L"runas", L"powershell.exe", L"Remove-Item -Path YourProgramName.exe -Force", 0, SW_HIDE);

    return 0;
}

如果不明显,请将 YourProgramName.exe 替换为您自己的程序名称。


-4
投票

这是一个足够合理的问题,但似乎您不了解可执行文件是如何工作的。执行将程序放置在内存中,因此删除磁盘文件很简单(前提是您不删除运行时依赖项)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.