exe 自删除 bat 自删除

bat自删除,只需要在bat文件的最后添加 del %0 或者 del "filename"即可,其中filename为bat文件的文件名,例如:


;seldef.bat

del %0

del "seldef.bat"


============================================

exe自删除

转自:http://bbs.chinaunix.net/thread-393423-1-1.html

程序的自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢?

自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾写的,太经典了,不能不提。程序如下:

  1. #include "windows.h"

  2. int main(int argc, char *argv[])
  3. {
  4.     char    buf[MAX_PATH];
  5.     HMODULE module;
  6.     
  7.     module = GetModuleHandle(0);
  8.     GetModuleFileName(module, buf, MAX_PATH);
  9.     CloseHandle((HANDLE)4);
  10.     
  11.     __asm 
  12.     {
  13.       lea     eax, buf
  14.       push    0
  15.       push    0
  16.       push    eax
  17.       push    ExitProcess
  18.       push    module
  19.       push    DeleteFile
  20.       push    UnmapViewOfFile
  21.       ret
  22.     }
  23.      
  24.     return 0;
  25. }
复制代码

试试编译它,运行。怎么样?从你的眼皮底下消失了吧?是不是很神奇?

Gary Nebbett 钻了系统的一个漏洞,他的程序是关闭了 exe 文件的 IMAGE(硬编码为4),然后用 UnmapViewOfFile 解除了 exe 文件在内存中的映象,接着通过堆栈传递当前程序的路径名缓冲区指针给 DeleteFile() ,实现了程序的自删除。

Gary Nebbett 果然不愧为 WIN 系统下顶尖的底层高手。那么是否还有其他的方法实现程序的自删除呢?答案是肯定的。

在 Win9x/ME 下,还可以利用 WININIT.INI 的一些特性。在 WININIT.INI 文件里面有一个节 [Rename] ,只要在里面写入要 “Nul=要删除的文件”,那么下次系统重新启动的时候,该文件就会被自动删除了。以下是一个例子:

[Rename]
NUL=c:\SelfDelete.exe 

利用这个特性,我们就可以在程序中对这个 ini 文件进行操作。值得注意的是,当需要自删除的文件多于一个的时候,就不能使用 WritePrivateProfileString 来实现,因为这个 API 会阻止多于一个“NUL=”这样的入口在同一个节里面出现,所以最好还是自己手动实现。

第三种方法是利用批处理文件。先让我们做一个试验:

创建一个 a.bat ,给它写入以下内容:

del %0.bat 

现在运行它吧,屏幕一闪而过,最后留下一串字符:“The batch file cannot be found”。这时候它已经从你的硬盘中消失了。

这说明,批处理文件是可以删除自己的,于是我们可以把这个小技巧运用在自己的程序当中:

:Repeat
del "C:\MYDIR\SelfDelete.exe"
if exist "SelfDelete.exe" goto Repeat
rmdir "C:\MYDIR"
del "\DelUS.bat" 


注明: 可以使用程序生成这个bat文件,然后再程序执行的最后使用ShellExecute执行bat文件即可,C++例子如下:

===============

int main(int argc, char* argv[], char* envp[])
{
char chModuleFile[512];
::GetModuleFileName(NULL, chModuleFile, sizeof(chModuleFile));

CFile f;
char chBatFile[] = "0c8c4688-9fd3-48d3-9972-b04d1c5ae11b.bat";

if (!f.Open(/*CA2T(*/chBatFile/*)*/, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite))
return 0;
char chBuff[1024];
//sprintf_s(chBuff, sizeof(chBuff), ":Repeat\r\ndel \"%s\" \r\nif exist \"%s\" \
goto Repeat \r\ndel %s",    chModuleFile, chModuleFile, chBatFile);


_snprintf(chBuff, sizeof(chBuff), ":Repeat\r\ndel \"%s\" \r\nif exist \"%s\" \
goto Repeat \r\ndel %s",    chModuleFile, chModuleFile, chBatFile);


f.Write(chBuff, strlen(chBuff));

f.Close();

::ShellExecute(NULL, "open", chBatFile, "", "", SW_HIDE);

return 0;
}

===============


它会重复不断地搜索是否有 SelfDelete.exe 这个文件,直到删除了它为止;当删除完毕后,这个批处理文件就会把自己删除。
(注:本方法可以支持所有的 Windows 版本,即 Win9x/Me/NT/2000/XP)

用批处理文件的方法有一个缺陷,就是会突然弹出一个 DOS 窗,冷不防的吓人一跳,不过据我所知这是目前唯一可以在 WinXP 下起作用的方法。当然,最理想的方法是用 Gary Nebbett 的那种,不过它的缺陷是没法在 WinXP 下起作用。

(注:Gary Nebbett 的方法,hume已经给出了例子,所以我就不重复了,请到他的网站 http://humeasm.yeah.net 下载。)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值