# 自删除程序示例代码 **Repository Path**: cutecuteyu/self_delete_code_sample ## Basic Information - **Project Name**: 自删除程序示例代码 - **Description**: No description available - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-19 - **Last Updated**: 2026-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C++ 自删除程序示例 这是一个展示Windows平台下C++程序自删除的示例项目,包含了市面上常见的几种自删除实现方式。 ## 项目概述 本程序演示了如何在程序运行完成后自动删除自身的可执行文件。程序会先输出"hello",然后根据选择的删除方式执行自删除操作。 ## 特性 - 包含4种不同的自删除实现方式 - 支持通过编译宏选择不同的删除方法 - 使用MinGW编译器编译 - 跨平台兼容(仅限Windows系统) ## 项目结构 ``` NEWTEST/ ├── main.cpp # 主程序源代码 ├── build.bat # 编译脚本 └── README.md # 项目文档 ``` ## 四种自删除方式 ### 方式1:CMD Delete 通过`CreateProcess`启动`cmd.exe`执行删除命令。 **优点**: - 实现简单 - 不需要额外文件 **缺点**: - 依赖于cmd.exe - 可能被安全软件拦截 **工作原理**: ```cpp // 启动cmd.exe,延迟1秒后删除自身 cmd /c timeout /t 1 /nobreak > nul & del "程序路径" > nul 2>&1 ``` ### 方式2:Batch Script 创建临时批处理脚本,脚本删除程序后自删除。 **优点**: - 可靠性高 - 脚本会自动清理自己 **缺点**: - 会创建临时文件 - 稍微复杂一些 **工作原理**: 1. 创建一个批处理文件(程序名.exe.bat) 2. 批处理文件包含以下命令: - 等待1秒 - 删除原程序 - 删除批处理文件自身 ### 方式3:MoveFileEx 使用Windows API的`MoveFileEx`函数标记文件在系统重启后删除。 **优点**: - 使用Windows原生API - 最可靠的方式 - 适用于被锁定的文件 **缺点**: - 需要管理员权限 - 文件不会立即删除,需要重启 **工作原理**: ```cpp MoveFileExW(文件路径, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); ``` ### 方式4:ShellExecute 通过`ShellExecute`调用cmd.exe执行删除命令。 **优点**: - 使用标准Windows API - 实现简洁 **缺点**: - 依赖于ShellExecute - 可能被安全软件拦截 **工作原理**: ```cpp ShellExecuteW(NULL, L"open", L"cmd.exe", 删除命令, NULL, SW_HIDE); ``` ## 编译说明 ### 环境要求 - **操作系统**:Windows - **编译器**:MinGW GCC (推荐版本 9.0+) - **链接库**:kernel32, shell32 ### 编译方法 #### 使用编译脚本(推荐) 在PowerShell中运行: ```powershell # 编译方式1(默认) .\build.bat 1 # 编译方式2 .\build.bat 2 # 编译方式3 .\build.bat 3 # 编译方式4 .\build.bat 4 ``` #### 直接使用g++命令 ```powershell # 方式1 g++ -std=c++11 -DMETHOD=1 main.cpp -o self_delete.exe -lkernel32 -lshell32 # 方式2 g++ -std=c++11 -DMETHOD=2 main.cpp -o self_delete.exe -lkernel32 -lshell32 # 方式3 g++ -std=c++11 -DMETHOD=3 main.cpp -o self_delete.exe -lkernel32 -lshell32 # 方式4 g++ -std=c++11 -DMETHOD=4 main.cpp -o self_delete.exe -lkernel32 -lshell32 ``` ### 编译选项说明 - `-std=c++11`:使用C++11标准 - `-DMETHOD=N`:指定使用的删除方式(1-4) - `-o`:指定输出文件名 - `-lkernel32 -lshell32`:链接Windows API库 ## 使用方法 ### 运行程序 编译成功后,运行生成的可执行文件: ```powershell .\self_delete.exe ``` ### 程序执行流程 1. 程序启动 2. 输出"hello" 3. 显示使用的删除方式 4. 执行自删除操作 5. 程序终止 6. 可执行文件被删除(方式3除外,需要重启) ## 注意事项 ### 安全性提示 - 本程序仅用于学习和研究目的 - 不要用于恶意软件制作 - 在生产环境中使用自删除功能需要谨慎 ### 各方式的限制 **方式1和方式4**: - 依赖cmd.exe - 可能被杀毒软件拦截 - 需要程序有足够权限删除自身 **方式2**: - 会创建临时批处理文件 - 需要磁盘写入权限 - 批处理文件可能被安全软件拦截 **方式3**: - **必须以管理员身份运行** - 文件不会立即删除,需要重启系统 - 即使文件被锁定也能标记删除 ### 测试建议 - 在测试目录中运行,避免删除重要文件 - 使用副本进行测试,保留原始源代码 - 方式3需要以管理员身份运行PowerShell ## 技术细节 ### 核心API函数 - `GetModuleFileNameW()`:获取当前程序完整路径 - `CreateProcessW()`:创建新进程 - `ShellExecuteW()`:执行Shell命令 - `MoveFileExW()`:移动或标记删除文件 - `STARTUPINFOW`:进程启动信息结构 - `PROCESS_INFORMATION`:进程信息结构 ### 延迟删除的实现 方式1、2、4都使用`timeout`命令延迟1秒,确保主程序完全退出后再执行删除操作: ```bash timeout /t 1 /nobreak > nul ``` ### 隐藏窗口的实现 使用`STARTF_USESHOWWINDOW`和`SW_HIDE`标志隐藏cmd窗口: ```cpp si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ``` ## 代码结构 ### 主要函数 ```cpp // 获取当前程序路径 wstring GetSelfPath(); // 方式1:CMD删除 void Method1_CmdDelete(); // 方式2:批处理脚本删除 void Method2_BatchScript(); // 方式3:MoveFileEx延迟删除 void Method3_MoveFileEx(); // 方式4:ShellExecute删除 void Method4_ShellExecute(); // 自删除调度函数 void SelfDelete(); ``` ### 程序入口 ```cpp int main() { cout << "hello" << endl; SelfDelete(); return 0; } ``` ## 故障排除 ### 编译错误 **错误**:找不到头文件 ``` 解决方案:确保MinGW已正确安装并配置环境变量 ``` **错误**:链接错误 ``` 解决方案:添加 -lkernel32 -lshell32 链接选项 ``` ### 运行错误 **问题**:程序没有被删除 ``` 解决方案: - 检查文件是否被其他程序占用 - 检查是否有足够的文件删除权限 - 方式3需要以管理员身份运行 ``` **问题**:批处理文件残留 ``` 解决方案:手动删除残留的.bat文件 ``` ## 扩展建议 可以进一步扩展的功能: 1. 添加日志记录功能 2. 实现多种删除方式的组合使用 3. 添加删除失败的重试机制 4. 支持自定义延迟时间 5. 添加删除前的确认提示 6. 实现跨平台支持(Linux/macOS) ## 许可证 本项目仅供学习和研究使用。 ## 作者 Created as a demonstration of self-deleting techniques in C++ on Windows. ## 更新日志 ### Version 1.0 - 初始版本 - 实现4种自删除方式 - 添加编译脚本 - 完善文档