; 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