欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

EXE程序的自删除实现

程序员文章站 2023-11-25 18:08:46
EXE程序的自删除实现...

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

自删除(self deleting)最早的方法是由 gary nebbett 大虾写的,太经典了,不能不提。程序如下:

#include "windows.h"

int main(int argc, char *argv[])
{
char buf[max_path];
hmodule module;

module = getmodulehandle(0);
getmodulefilename(module, buf, max_path);
closehandle((handle)4);

__asm 
{
lea eax, buf
push 0
push 0
push eax
push exitprocess
push module
push deletefile
push unmapviewoffile
ret
}

return 0;
}

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

gary nebbett 钻了系统的一个漏洞,他的程序是关闭了 exe 文件的 image(硬编码为4),然后用 unmapviewoffile 解除了 exe 文件在内存中的映象,接着通过堆栈传递当前程序的 handle 给 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"

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

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