• 标 题:再来一个tip: 9x和2k下exe文件的自删除代码 (3千字)
  • 作 者:hume
  • 时 间:2002-10-20 15:22:29
  • 链 接:http://bbs.pediy.com

;                  exe运行时文件自删除的实现(适用于9x/2K)
;Theory:

;1)为什么运行时的exe文件不能被删除?

;Windows 操作系统为内核对象保存着一个计数,只要这个计数不为0,那么这个内核
;对象就不会被释放,对其进行的删除操作等也就不能成功。为了达成我们的目的,必须
;在执行deletefile前将运行的exe本身的内核计数减为0。

;2)9x和NT/2K实现的不同

;9x下只要对exe本身先执行FreeLibrary操作即可解除exe image在内存的映射,
;2K/NT下需要先关闭硬编码为4(exe本身对应image的句柄),然后对exe本身的内存
;映像unmapview即可解除映射,最后的操作是相同的就是执行DeleteFile.

;3)其他方法
;文件自删除的方法不止一种,很多,但这里的可能是最简洁的.

;3)为什么还写一遍?
;包括Gary Nebbett等高人都写过类似代码,但我还没发现在9X和NT上全部正常的代码
;实际上思路很简单,就是让上述两种平台的API代码全部执行一遍,在一种平台上可能
;会有几个失败,有几个会成功,没有关系!最后的结果是exe文件在退出前就被删除了!
;最后还是为了使用我喜欢的fasm.

;4)价值
;适用于反安装程序最后的自删除或者你要写个木马、病毒首次安装的自毁.
;注意:此方法在Xp上无效.(还未发现在xp平台下用此类方法的代码)
;经9X和2K下测试通过.

;compile:
;fasm %1 selfkill.exe
;
;
;                                      YJ.Hume.冷雨飘心
;                                      humeasm.yeah.net
format  PE GUI 4.0
entry  StArT
section 'CODE' code readable writeable executable
StArT:     
       
        ;int 3
        sub    esp,260
        mov    edi,esp

        push    260
        push    edi
        push    0
        call    [GetModuleFileName]

        push    0
        call    [GetModuleHandle]

       
        push    0
        push    0                     
        push    edi
        push    [ExitProcess]
        push    eax
        push    [DeleteFile]
        push    eax       
        push    [UnmapViewOfFile]
        push    4
        push    [FreeLibrary]         
        push    [CloseHandle]

        ret
;------------------------[IAT 数据〕-----------------
section '.idata'  import data readable writeable
      dd 0,0,0,rva zk32_names,RVA k32_first_thunk_array
      dd 0,0,0,rva zu32_names,RVA u32_first_thunk_array
        times 5 dd 0
k32_first_thunk_array:
ExitProcess            dd RVA __aExitProcess
GetModuleFileName      dd RVA __aGetModuleFileName
DeleteFile              dd RVA __aDeleteFile
GetModuleHandle        dd RVA __aGetModuleHandle
FreeLibrary            dd RVA __aFreeLibrary
CloseHandle            dd RVA __aCloseHandle
UnmapViewOfFile        dd RVA __aUnmapViewOfFile
                dd 0
__aExitProcess  dw 0
                db "ExitProcess",0
__aGetModuleFileName dw 0
                db "GetModuleFileNameA",0
__aDeleteFile  dw 0
                db "DeleteFileA",0
__aGetModuleHandle dw 0
                db "GetModuleHandleA",0
__aFreeLibrary  dw 0
                db "FreeLibrary",0
__aCloseHandle  dw 0
                db "CloseHandle",0
__aUnmapViewOfFile dw 0
                db "UnmapViewOfFile",0
u32_first_thunk_array:
MessageBox      dd RVA __aMessageBox
wsprintf        dd RVA __wsprintf
                dd 0
__aMessageBox  dw 0
                db "MessageBoxA",0
__wsprintf      dw 0
                db "wsprintfA",0
zk32_names db "KERNEL32.DLL",0
zu32_names db "USER32.DLL",0