abcdlcq的个人主页

http://www.qtcn.org/bbs/u/118073  [收藏] [复制]

abcdlcq

  • 13

    关注

  • 15

    粉丝

  • 38

    访客

  • 等级:新手上路
  • 总积分:83
  • 男,1984-01-01

最后登录:2017-09-29

更多资料

日志

程序的自删除

2011-08-10 16:44
自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾写的,太经典了,不能不提。程序如下:
  1. #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 文件在内存中的映象,接着通过堆栈传递当前程序的路径名缓冲区指针给 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 下起作用。

分类:默认分类|回复:1|浏览:1412|全站可见|转载
 
 
删除

工程男孩:厉害 真看不懂

2011-08-11 09:23 -

Powered by phpwind v8.7 Certificate Copyright Time now is:05-06 08:43
©2005-2016 QTCN开发网 版权所有 Gzip disabled