肥宅钓鱼网
当前位置: 首页 钓鱼百科

自动化删除(自删除技术详解)

时间:2023-07-24 作者: 小编 阅读量: 3 栏目名: 钓鱼百科

顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat。比较常见的批处理包含两类:DOS批处理和PS批处理。而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。实现过程批处理方式这里有一个注意的点,一种是使用choice命令进行延迟,另一种则使用ping命令进行延迟。WindowsXP版本比Windows2003版本低,所以不支持choice命令。

基础知识

这里首先说一下程序自删除实现的思路:程序创建一个批处理文件,并创建进程执行,然后程序结束进程;批处理所做的功能便是延时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这个api

GetModuleFileName

检索包含指定模块的文件的完全限定路径。

DWORD GetModuleFileNameA([in, optional] HMODULE hModule,[out]LPSTRlpFilename,[in] DWORDnSize);

那么我们首先要写一个函数进行批处理文件的自动生成,这里直接用wsprintf写入即可

::wsprintf(szBat, "@echo off\nchoice /t %d /d y /n >nul\ndel *.exe\ndel %%0\n", 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 off\nchoice /t %d /d y /n >nul\ndel *.exe\ndel %%0\n", 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);

然后把批处理文件跟程序放到同一目录下

::wsprintf(szBat, "%s\\test.bat", szPath);

然后调用cmd命令行

::wsprintf(szCmd, "cmd /c call \"%s\"", szBat);

再调用之前编写的CreateBat创建批处理文件

bRet = CreateBat(szBat);

最后就是使用CreateProcess创建进程,但是这里有一个比较特殊的地方,就是我们需要隐蔽执行,那么我们就可以使用不显示执行程序窗口的模式,这个参数在CreateProcess的第九个参数,首先看一下CreateProcess的结构

BOOL CreateProcessA([in, optional]LPCSTRlpApplicationName,[in, out, optional] LPSTRlpCommandLine,[in, optional]LPSECURITY_ATTRIBUTES lpProcessAttributes,[in, optional]LPSECURITY_ATTRIBUTES lpThreadAttributes,[in]BOOLbInheritHandles,[in]DWORDdwCreationFlags,[in, optional]LPVOIDlpEnvironment,[in, optional]LPCSTRlpCurrentDirectory,[in]LPSTARTUPINFOAlpStartupInfo,[out]LPPROCESS_INFORMATION lpProcessInformation);

就是LPSTARTUPINFOA这个参数,这个参数决定了新进程的主窗体如何显示的STARTUPINFO结构体,我们继续跟到STARTUPINFO结构体里面

typedef struct _STARTUPINFOA {DWORDcb;LPSTRlpReserved;LPSTRlpDesktop;LPSTRlpTitle;DWORDdwX;DWORDdwY;DWORDdwXSize;DWORDdwYSize;DWORDdwXCountChars;DWORDdwYCountChars;DWORDdwFillAttribute;DWORDdwFlags;WORDwShowWindow;WORDcbReserved2;LPBYTE lpReserved2;HANDLE hStdInput;HANDLE hStdOutput;HANDLE hStdError;} STARTUPINFOA, *LPSTARTUPINFOA;

若要隐藏窗口,则dwFlags的值需要设置为STARTF_USESHOWWINDOW,wShowWindow的值设置为false即可

STARTUPINFO si = { 0 };si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = FALSE;

然后调用CreateProcess启动进程

BOOL bRet = CreateProcess(NULL,szCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL,NULL, &si, &pi);

这里编译一下看看效果,这里直接退出了,什么也没有,证明是对的,因为我们隐藏了cmd的窗口

这里我们把wShowWindow的值改为TRUE再查看一下效果

这里看起来效果还是不明显,我们再换种方式,直接运行exe,发现在同目录下生成了test.bat

10s过后发现exe跟bat都已经删除,证明我们的自删除成功

上面提到,在xp是没有choice的命令的,那么可以用ping命令代替,bat的代码如下

@echo offping 127.0.0.1 -n 10del *.exedel %0

与choice相似,这里就不细说了,直接改一下代码就可以

BOOL CreateBat(char *pszBatFileName){int time = 5;char szBat[MAX_PATH] = { 0 };::wsprintf(szBat, "@echo off\nping 127.0.0.1 -n %d\ndel *.exe\ndel %%0\n", 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;}

这里再提一个小tips,这里我们实现的是cmd.exe的自启动与删除,那么在实战过程中能否写成cs的上线exe的自删除呢?答案是肯定的,这里就不拓展了。

MoveFileEx方式

我们首先看一下MoveFileEx这个api

BOOL MoveFileExA([in] LPCSTR lpExistingFileName,[in, optional] LPCSTR lpNewFileName,[in] DWORDdwFlags);

dwFlags:设置移动标志,指明要怎样操作文件或者目录。

MOVEFILE_COPY_ALLOWED:当需要移动文件到不同的盘符时需要指定此值,不然会失败,这个值不能和MOVEFILE_DELAY_UNTIL_REBOOT一起用

MOVEFILE_DELAY_UNTIL_REBOOT:文件并不立即移动,当下一次机器重启时文件才执行移动 ,不能和MOVEFILE_COPY_ALLOWED同时用

MOVEFILE_FAIL_IF_NOT_TRACKABLE:当源文件是连接资源时会移动失败。

MOVEFILE_REPLACE_EXISTING:当目的文件已经存在时,要将lpExistingFileName的内容替换掉以前的内容,此时要检查ACL权限,可能会失败

MOVEFILE_WRITE_THROUGH:只有当文件完全到达目的文件的时候函数才返回,缓冲区也不能有未留的数据

MoveFileEx这个函数调用的时候有几个需要的点,第一个就是当dwFlags为MOVEFILE_DELAY_UNTIL_REBOOT时,需要为system或administrartor权限才能执行,第二个点就是如果要移动目录需要保证目录不存在才可以,第三个点就是不能在不同的盘符下移动目录。

那么我们这里实现自删除的话,就是好需要设置dwFlags为MOVEFILE_DELAY_UNTIL_REBOOT,这里为什么要system或者administrator权限呢,是因为MoveFileEx是通过写入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations这个注册表路径来达到移动或删除的目的,我们可以看到这个键是位于HKEY_LOCAL_MACHINE的,而不是USER,所以必须要administrator权限进行修改

这里我们看一下这个键值,它的类型是REG_MULTI_SZ,那么意味着这个键值能够写入多个字符串

经过探究后发现,MoveFileEx这个api在执行删除操作写入File\0\0到PendingFileRenameOperations,而如果是执行移动操作则是把File\0OtherFile\0写入PendingFileRenameOperations

那么如何用MoveFileEx实现自删除呢,首先提两个概念,AUTOCHK和页面文件。

这里说下何为AUTOCHK:

在msdn的官方解释中,AUTOCHK的含义是:Runs when the computer is started and prior to Windows Server starting to verify the logical integrity of a file system.

也就是说AUTOCHK其实是用来验证文件系统的逻辑完整性的,那么再说说页面文件:

页面文件,是指操作系统反映构建并使用虚拟内存的硬盘空间大小而创建的文件。要整理页面文件,首先将页面文件从原先所在的驱动器移动到其他驱动器,然后对原来驱动器进行整理,最后再将页面文件移回到原驱动器上,此时页面文件就会存放在连续的磁盘空间中了。具体来说,在 windows操作系统下(Windows 2000/XP)pagefile.sys这个文件,它就是系统页面文件(也就是大家熟知的虚拟内存文件),它的大小取决于打开的程序多少和你原先设置页面文件的最小最大值,是不断变化的,有时可能只有几十MB,有时则达到几百甚至上千MB。

那么这两个概念有什么关联呢,有一个时间节点就是,用户在启动计算机时,执行了AUTOCHK,但是还没有创建页面文件,在这个时间节点下,可以说话用户是还没有完全进入操作系统的,那么这时候就可以删除在正常情况下删除不了的文件,我的理解是在没有创建页面文件的时候,其实操作系统是还没有启动完全的,所以这时候可执行文件其实是没有完全加载好的。

那么我们知道了原理,这里实现一下,其实代码相比于批处理方式少了很多,但是涉及到的知识点却是一点都不少。我们在前面发现在PendingFileRenameOperations键的数值数据中,路径前面都有\??\,但是这里并不是加上\??\,在MoveFileEx的函数定义中删除文件的路径开头需要加上\\?\

所以我们在缓冲区前面先加上\\?\

char szTemp[MAX_PATH] = "\\\\?\\";

因为我们要把路径写在缓冲区后面,就要使用到lstrcat

::lstrcat(szTemp, szFileName);

然后调用MoveFileEx实现自删除

BOOL bRet = ::MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);

完整代码如下

BOOL MoveDel(char* szFileName){char szTemp[MAX_PATH] = "\\\\?\\";::lstrcatA(szTemp, szFileName);BOOL bRet = ::MoveFileExA(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);if (bRet == NULL){printf("[!] MoveFileExA failed, error is : %d\n\n", GetLastError());return FALSE;}else{printf("[*] MoveFileExA successfully!\n\n");}return TRUE;}

这里我们直接执行一下,发现报错5,对应GetLastError的报错属性是权限不够,这里我们之前提到过需要修改注册表,所以直接用user权限启动是拒绝访问的

这里我们改用administrator启动程序,可以看到已经执行成功

到PendingFileRenameOperations键值下查看已经添加成功,这里重启之后就会进行删除

后记

我们对两种自删除的方式进行了实现,这个地方我们可以发现,MoveFileEx方式是需要重启电脑后才能够进行删除,而批处理则可以不用重启就可以删除,这里可以根据具体用途才用具体方法进行实现。

本文由Drunkmars原创发布转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/259050安全客 - 有思想的安全新媒体

,
    推荐阅读
  • 上海印象原创(原创春天你好)

    可今年阳春三月之时,上海遭遇新冠疫情,大家都自觉宅在家中,不给政府添乱。是啊,上海,你拥有国际大都市的现代气质,你拥有海纳百川的宽广胸怀,你正以矫健的步伐走向未来,给人民创建着美丽的城市,美好的生活!上海必将迎来崭新的春天!最后结尾三段的抒情,表达了对上海家乡的热爱和赞美,升华了文章的主旨,让人感受到美好的希望和未来。在这个特殊时期,荐赏此文,让我们坚信,上海抗疫必胜,上海的未来更美好!

  • 国庆买车能开回去吗(国庆过后有车一族要小心了)

    目前,诈骗手段花样频出,“交通违章”诈骗短信就是其中一种。称爱车在外地有违章记录,要在15天内到违法行为发生地缴罚款,逾期将产生滞纳金。◆电信诈骗新鲜花样出笼据民警介绍,这是电信诈骗的一种新手段。一旦有在异地违章的情况发生,车主可自由选择在机动车登记地或违法行为发生地的公安交通管理部门处理。

  • 做干豆腐的豆浆是怎样做出来的(哪些豆腐豆浆粉)

    大豆指是黄豆、黑豆和青豆。痛风发作期要严格限制嘌呤摄入,只能选择低嘌呤含量的食物,但是只是尿酸高并没发作痛风,可以适量食用嘌呤含量中等的食物。另外,有观察性研究表明,在亚洲女性中,儿童和青少年时期的大豆饮食摄入越多,日后患乳腺癌的风险就越低。可以像豆腐、豆腐干在制作过程挤出了很多黄浆水,这个过程也降低了草酸含量;另外它们钙含量高,钙还能在胃肠道结合部分草酸,反而有利于预防草酸钙类型的肾结石。

  • 天官赐福漫画是不是换人了(天官赐福漫画详情页上线)

    在得知《渣反》出漫画的时候,想必非常多的原著粉欣喜若狂,毕竟出动漫的时候《渣反》可是一拖再拖,而漫画却是一反常态,雷厉风行。在一大众粉丝的吐槽之下,《渣反》漫画下线。而粉丝们期待的目光也从《渣反》转向了《天官赐福》漫画。其次从大佬以往发布的作品来看,是个不折不扣的原著粉了,这次接《天官赐福》的漫画,应该可以说是为爱发电了。反正小编是对《天官赐福》的漫画充满期待,只能期望十一长假快点到来!

  • 东数西算为什么这么疯狂(东数西算是什么)

    近日,国家发展改革委、中央网信办、工业和信息化部、国家能源局联合印发通知,同意在京津冀、长三角、粤港澳大湾区、成渝、内蒙古、贵州、甘肃、宁夏等8地启动建设国家算力枢纽节点,并规划了10个国家数据中心集群。至此,全国一体化大数据中心体系完成总体布局设计,“东数西算”工程正式全面启动。只要能用技术解决数据传输的安全,快速问题,那么把数据中心在西部就是最好的方案。

  • 《方舟:生存进化》铁矿分布图及快速挖铁矿技巧攻略

    很多铁矿石,只要你拿的动可以一次采上千,一般在中北部骑个老鹰去秃山顶,一次就400多个了搬家,搬个离山近点的,去山上挖,我就是在绿色方舟正下方搬到了火山下面河边的全地图只有西南面没有矿那地方适合新手过渡,还有就是被打得无路可逃的人.更多相关资讯请关注:方舟:生存进化专题

  • 有关岳阳楼的诗(与岳阳楼有关的诗句)

    有关岳阳楼的诗《登岳阳楼》杜甫昔闻洞庭水,今上岳阳楼。亲朋无一字,老病有孤舟。《与夏十二登岳阳楼》李白楼观岳阳尽,川迥洞庭开。雁引愁心去,山衔好月来。《岳阳楼晚望》唐崔珏乾坤千里水云间,钓艇如萍去复还。《道经巴陵登岳阳楼用孟襄阳韵》杨维桢,元末送客洞庭西,龙堆两青青。怀人故未休,望望欲成往。《登岳阳楼》李东阳,明突兀高楼正倚城,洞庭春水坐来生。《岳阳楼》钱大昕清杰阁出城墉,惊涛日夜舂。

  • 煮牛肉怎么做不老(牛肉怎么做好)

    下面希望有你要的答案,我们一起来看看吧!煮牛肉怎么做不老牛肉腌过后再煮就不老了。准备材料:牛肉250克,食用油2汤匙,胡椒粉1小匙,蚝油1汤匙,生抽1汤匙,水2汤匙,淀粉1小匙。买来的牛肉切成薄片备用。牛肉放入容器中,倒入食用油、胡椒粉、蚝油、生抽和清水。腌料加入后,用手抓揉牛肉。牛肉抓匀后,腌渍15分钟左右即可。

  • 河童之夏观后感(河童之夏观后感范文)

    简朴的画风,耐人寻味的细节,是这部《河童之夏》较其他日漫优秀之处。小咕是河童是妖怪,也是孩子,还是没爹没妈的孩子。小咕的父亲请求官大人不要把河童赖以生存的龙神沼改造成稻田,但未果,且惨遭杀害。那么在《河童之夏》中,就是伤害一个孩子,暴露出人性的负面。在河童心中,最重要的是一条鲤鱼,而在人类心中,绝对没有利益的终点。这是小咕在康一一家人面前说的话。

  • 情人的真正含义是什么(情人的真正理解)

    真正的情人,是有情之人,不为钱,不为名,不为利,图什么呢?图的就是你这个人,今天小编就来说说关于情人的真正含义是什么?下面更多详细答案一起来看看吧!所以情人可以是知己,也可以是暧昧,更可以是两性间的男女朋友。许多情人之所以在一起,压根没想过破坏别人家庭,就是想要一个陪伴,就是因为缘分,本来没想,却偏偏爱上。