程序的自删除

如何让exe自己删除自己?? 我们都知道,当一个exe程序在启动之后,操作系统会把这个可执行文件加载到内存中去,在程序处于运行状态时,如果我们想要把这个文件删除,那就会出现以下情况: 那我们将不得不等到程序执行完毕之后,手动的来删除这个文件,但是有没有一种办法可以直接在程序退出的时候,就自动删除这个可执行文件呢?? 加入我们想要用我们的程序做一些“坏事”,比如说是我们要实现一个IATHook,我们需要一个启动进程,在目标进程地址空间中申请空间,进而实现dll的注入,启动dll。 当我们的启动进程完成对目标进程的注入这些事情之后,能不能 阅读详情
 
程序的自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很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 下起作用。

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


以上的方法都是前辈高人的研究总结,可不是我原创的,不过最后我给出一个 Win32ASM 例子,演示一下用批处理文件删除程序自身的方法。


;******************************************************
;程序名称:程序自删除示例,适用于Win9x/WinMe/Win2000/WinXP
;作者:罗聪
;日期:2002-10-23
;出处:http://www.luocong.com(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://www.luocong.com)
;******************************************************

.386
.model flat, stdcall
option casemap:none

include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/shell32.inc
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/shell32.lib

DeleteExecutableBF        PROTO

.code
main:
    invoke DeleteExecutableBF
    invoke ExitProcess, NULL

;********************************************
; 模块功能:用批处理文件删除自身
; 入口参数:无
; 出口参数:无
;********************************************
DeleteExecutableBF    proc
    LOCAL    hFile                :DWORD
    LOCAL    len                  :DWORD
    LOCAL    hHeap                :DWORD    
    LOCAL    pszUnsetupPathname   :DWORD
    LOCAL    pszUnsetupPath       :DWORD
    LOCAL    pszBatFilePathname   :DWORD
    LOCAL    pBatFile             :DWORD

    jmp nextcode

    szBatFileName                 BYTE    "DelUS.bat", 0
    szOpen                        BYTE    "open", 0
    szBKSlash                     BYTE    "/", 0
    L1                            BYTE    ":Repeat", 13, 10, 0
    L2A                           BYTE    "del """, 0
    L2B                           BYTE    """", 0
    L3A                           BYTE    13, 10, "if exist """, 0
    L3B                           BYTE    """ goto Repeat", 13, 10, 0
    L4                            BYTE    "rmdir """, 0
    L5                            BYTE    """",13, 10, "del """, 0
    L6                            BYTE    """",13, 10, 0
    
nextcode:
    ; 为字符串分配堆:
    invoke GetProcessHeap
    mov hHeap, eax
    invoke HeapAlloc, hHeap, NULL, 4 * MAX_PATH + 1000
    mov pszUnsetupPath, eax
    add eax, MAX_PATH
    mov pszUnsetupPath, eax
    add eax, MAX_PATH
    mov pszUnsetupPathname, eax
    add eax, MAX_PATH    
    mov pszBatFilePathname, eax
    add eax, MAX_PATH        
    mov pBatFile, eax

    ; 创建一个批处理文件,用于删除我们的exe文件。当exe文件被删除后,这个批处理文件会自动删除自己,以及它所在的目录。

    ; 得到 temp 目录的路径:
    invoke GetTempPath, MAX_PATH, pszBatFilePathname

    invoke lstrcat, pszBatFilePathname, addr szBatFileName
    invoke CreateFile, pszBatFilePathname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
                   FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, NULL
    mov hFile, eax
    .if (hFile != INVALID_HANDLE_VALUE)

    ; 得到我们的 exe 文件的全路径(包括文件名):
    invoke GetModuleFileName, NULL, pszUnsetupPathname, MAX_PATH

    ; 得到我们的 exe 文件的路径(不包括文件名):
    invoke lstrcpy, pszUnsetupPath, pszUnsetupPathname

    ; 找到路径最后的 ’/’ 并把它改成0
    mov edx, pszUnsetupPath
    mov ecx, edx
    .repeat
        mov al, byte ptr [edx]
        .if al == 92 ; "/"
            mov ecx, edx
        .endif
       inc edx
    .until al == 0
        mov byte ptr [ecx+1], 0   

        ; Bat 文件的内容:
        ; :Repeat
        ; del "C:/Win95ADG/DelSelf.exe"
        ; if exist "DelSelf.exe" goto Repeat
        ; rmdir "C:/Win95ADG"
        ; del "c:/%temppath%/DelUS.bat"
        invoke lstrcat, pBatFile, addr L1
        invoke lstrcat, pBatFile, addr L2A
        invoke lstrcat, pBatFile, pszUnsetupPathname
        invoke lstrcat, pBatFile, addr L2B
        invoke lstrcat, pBatFile, addr L3A
        invoke lstrcat, pBatFile, pszUnsetupPathname
        invoke lstrcat, pBatFile, addr L3B
        invoke lstrcat, pBatFile, addr L4
        invoke lstrcat, pBatFile, pszUnsetupPath
        invoke lstrcat, pBatFile, addr L5
        invoke lstrcat, pBatFile, pszBatFilePathname
        invoke lstrcat, pBatFile, addr L6

        ; 创建 bat 文件:
        invoke lstrlen, pBatFile
        mov len, eax
        invoke WriteFile, hFile, pBatFile, len, addr len, NULL
        invoke CloseHandle, hFile

        ; 现在在后台执行我们的 bat 文件:
        invoke ShellExecute, NULL, addr szOpen, pszBatFilePathname, NULL, NULL, SW_HIDE

    .endif
    
    ; 释放堆:
    invoke HeapFree, hHeap, NULL, pszUnsetupPath
return:
    ; 结束啦!
    ret

DeleteExecutableBF    endp

end main
;********************    over    ********************
;by LC
掌握自删除程序:DeleteSelf的实现与安全 在信息安全与数据隐私保护日益受到重视的今天,自删除功能作为程序设计中的一项重要特性,起着至关重要的作用。自删除功能确保程序在执行完毕或满足特定条件后,能够自动从运行环境或存储介质中彻底清除自身,以防止敏感数据泄露或减少系统资源占用。本文将对自删除功能的基本概念、实现方法、应用案例以及潜在风险进行探讨,并提供最佳实践指导,帮助开发者设计出既高效又符合合规要求的自删除程序 阅读详情

相关推荐

应用程序启动后修改自身EXE文件或自删除EXE文件

1.子进程等待父进程结束再处理事务(应用程序自删除); 2.父进程将句柄等信息传递给子进程; 3.EXE中加载的资源释放为本地文件。 见博客:http://blog.csdn.net/beanjoy/article/details/9228337

exe自删除程序.程序运行后,自己删除自己

vc++ exe自删除程序.程序运行后,自己销毁自己

实现执行中的exe文件自己删除自己

实现正在执行的程序自删除,在vc++ 6.0实现,使用的c语言

Windows——实现exe自删除

exe实现自删除

qq_44745063的博客 2825

自删除技术 (网上收集加理解)

<br />程序自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢? <br />自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾写的,太经典了,不能不提。程序如下: <br /> <br />#include "windows.h" int main(int argc, char *argv[]) { c

zhangmiaoping23的专栏 1899

如何简单实现可执行文件的自我删除

       可执行文件即 EXE 文件在运行过程中,由系统管理其打开的句柄。此时对该文件的一些操作是被系统禁止的,比如删除操作。然而在某些场合,可能须要程序有自我删除的功能,也就是程序运行结束后删除自身。基于这个想法,可以有一种很简单的方法来实现这个基本功能。        本方法基于两点来实现删除功能。一是利用 windows 的 command program 的删除文件操作;再者就是启

Kern 819

exe应用自删除、文件不可恢复式删除

实现exe应用自删除、文件不可恢复式删除

暂无内容 1189

在运行时自动删除自身的.exe文件

【源码免费下载链接】:https://renmaiwang.cn/s/6mv7e 完成对运行中程序的自动清除任务。通过vc++ 6.0平台开发,并采用c语言编写代码。

程序自删除方法大总结

程序自删除方法大总结 程序自删除早已经不是什么新鲜的话题了,对于各位大虾来说是更是比较容易的事情,但想想自己刚学时遇到的种种错误,我觉得有必要把自己所知道的各种方法总结一下,希望对新手的学习能够有所帮助。程序自删除广泛用于反安装程序最后的自删除(环保呀!),当然更多见于木马、病毒首次安装的自动销毁^*^,至于用于何种用途就看你自己啦!经典自删除说到程序自删除就不能不说由 Gary Nebbe

1486

程序自删除

原理 之所以可以使用批处理来实现文件自删除,是因为批处理有一个特别的地方就是:批处理提供了自己删除自己的命令: del %0 这个命令,批处理执行完后,就会把自身文件删除了,而且不放进回收站。所以,有了这个关键技术作为前提,使用批处理方式实现程序自删除,就好理解了。 构造自删除批处理文件,批处理文件的内容就是先延迟一定的时间,例如延迟 5 秒,然后开始删除指定文件后,再执行自删除命令 在程序中,创建一个新进程调用并批处理。进程创建成功后,立马结束进程 这样,进程创建起来,执行批处理文件。等批处理文件

LYSM 1136

EXE程序自删除实现

程序自删除已经不是什么新鲜的话题了,它广泛运用于木马、病毒中。试想想,当你的程序还在运行中(通常是完成了驻留、感染模块),它就自动地把自己从磁盘中删掉,这样一来,就做到了神不知鬼不觉,呵呵,是不是很cool呢? 自删除(Self Deleting)最早的方法是由 Gary Nebbett 大虾写的,太经典了,不能不提。程序如下:#include "windows.h"int main

sxjswift的专栏 1499

Delphi程序自删除

<br />总结了一下Delphi程序自删除的几种方法<br /> <br />program Project1;  //方法一<br />uses<br />  Windows;<br />function WinExec(lpCmdline: PAnsiChar; uCmdShow: LongWord): LongWord;<br />                 stdcall; external 'kernel32.dll' name 'WinExec';<br />function Extra

十年磨一剑,霜刃未曾试! 1527

应用程序启动后修改自身EXE文件或自删除EXE文件(附VC++6.0源码)

1.子进程等待父进程结束再处理事务(应用程序自删除); 2.父进程将句柄等信息传递给子进程; 3.EXE中加载的资源释放为本地文件。

BeanJoy的专栏 1万+

执行文件的自删除

Self-deleting Executables Techniques which allow an executable file to delete itself whilst running This is a subject that tends to come up every so often in the newsgroups,

liu_cheng_ran的专栏 1358
上一篇: 浅析”流光种植者”的编程实现
下一篇: Code--Synscan(扫描器代码)
netwindmiss
博客等级 码龄21年 15粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值