
文章插图
基础知识这里首先说一下程序自删除实现的思路:程序创建一个批处理文件 , 并创建进程执行 , 然后程序结束进程;批处理所做的功能便是延时5秒后 , 删除指定程序然后再自删除 。这样 , 程序自删除功能便实现了 。
自删除的实现主要可以使用两种方法 , 一种是利用批处理技术 , 另外一种则是调用windows提供的api进行实现
首先说一下批处理技术 。批处理(Batch) , 也称为批处理脚本 。顾名思义 , 批处理就是对某对象进行批量的处理 , 通常被认为是一种简化的脚本语言 , 它应用于DOS和Windows系统中 。批处理文件的扩展名为bat。比较常见的批处理包含两类:DOS批处理和PS批处理 。PS批处理是基于微软的强大的PowerShell的 , 用来批量处理一些任务的脚本;而DOS批处理则是基于DOS命令的 , 用来自动地批量地执行DOS命令以实现特定操作的脚本 。更复杂的情况 , 需要使用if、for、goto等命令控制程式的运行过程 , 如同C、Basic等高级语言一样 。如果需要实现更复杂的应用 , 利用外部程式是必要的 , 这包括系统本身提供的外部命令和第三方提供的工具或者软件 。批处理程序虽然是在命令行环境中运行 , 但不仅仅能使用命令行软件 , 任何当前系统下可运行的程序都可以放在批处理文件中运行 。
有些人认为批处理语言的含义要比上面的描述更广泛 , 还包括许多软件自带的批处理语言 , 如 Microsoft office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能 , 用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度) 。而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能 , 这样用户不必写程式就能得到批处理程序 。
在这个地方其实批处理也是一种特殊的语言 , 比如说我们要在cmd里面执行一些命令 , 就可以把他写成一个bat文件 。这里能够使用批处理实现自删除有一个前提就是 , 批处理提供了自己删除自己的命令 , 如下所示
del %0在批处理文件执行这个命令之后会直接对文件进行删除 , 而不是放入回收站 , 那么我们就可以先执行我们想要执行的程序 , 然后在sleep过后使用del %0删除自身即可 。实现过程批处理方式这里有一个注意的点 , 一种是使用 choice 命令进行延迟 , 另一种则使用 ping 命令进行延迟 。要注意的是 , choice 这个命令是从 Windows 2003开始才有这个命令 。也就是说 , Windows 2003版本或者以上版本才支持这个命令 , 对于低于Windows 2003的版本是不支持的 。Windows XP 版本比Windows 2003版本低 , 所以不支持 choice 命令 。

文章插图
那么我们首先进行choice命令的实现 , bat的代码如下
@echo offchoice /t 10 /d y /n >nuldel *.exedel %0我们整理下思路 , 要想实现自删除首先需要知道程序所在的目录 , 然后生成批处理文件并生成进程来执行批处理文件 , 主要用到的是GetModuleFileName这个apiGetModuleFileName
检索包含指定模块的文件的完全限定路径 。
Dword GetModuleFileNameA([in, optional] HMODULE hModule,[out]LPSTRlpFilename,[in]DWORDnSize);那么我们首先要写一个函数进行批处理文件的自动生成 , 这里直接用wsprintf写入即可::wsprintf(szBat, "@echo offnchoice /t %d /d y /n >nulndel *.exendel %%0n", time);然后使用fopen_s、fwrite生成批处理文件FILE *fp = NULL;fopen_s(&fp, pszBatName, "w+");fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp);完整代码如下BOOL CreateBat(char *pszBatFileName){int time = 5;char szBat[MAX_PATH] = { 0 };::wsprintf(szBat, "@echo offnchoice /t %d /d y /n >nulndel *.exendel %%0n", time);FILE *fp = NULL;fopen_s(&fp, pszBatFileName, "w+");if (NULL == fp){return FALSE;}fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp);fclose(fp);return TRUE;}然后我们首先获取程序所在的目录::GetModuleFileName(NULL, szPath, MAX_PATH);然后把批处理文件跟程序放到同一目录下
推荐阅读
- 厉害了!推荐一个 Web 端自动化神器 - Automa
- win10系统自带的截图快捷键有多香
- 2021年Android开发新技术动向,未来的路该怎么走?
- 仿古门窗制造技术简介
- 粉底液|别再说自己不会化妆了,这次我手把手教你
- 护肤|居家自救护肤攻略~护肤千万不可以偷懒
- 自己煮水果茶的配方,煮水果茶的禁忌是什么
- 中蜂觅蜂堂是合法的吗,中蜂是怎样自然分蜂的
- 上海市|上海一女大学生面试时被严重猥亵,女生讲述不堪细节,对方称自愿的
- |人在职场,有哪些事是在“作废”自己?
