文章作者:zshoucheng
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
程序自删除的方法有很多种
这里提供利用汇编编写的非批处理方式实现程序自删除
喜欢汇编的朋友交流下吧
复制内容到剪贴板
代码:
.586
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include macros.asm
includelib kernel32.lib
includelib user32.lib
SelfDelete proto
.data
cmd1 db ' /c del ',0
cmd2 db ' >nul',0
.data?
dwResult1 dd ?
dwResult2 dd ?
dwResult3 dd ?
.code
start:
invoke SelfDelete
invoke ExitProcess,0
SelfDelete proc
LOCAL szModule[MAX_PATH]:TCHAR,szComspec[MAX_PATH]:TCHAR,szParams[MAX_PATH]:TCHAR
LOCAL sinfo:STARTUPINFO,pi:PROCESS_INFORMATION
invoke RtlZeroMemory,addr sinfo,sizeof sinfo
mov sinfo.cb,sizeof sinfo
mov sinfo.dwFlags,STARTF_USESHOWWINDOW
mov sinfo.wShowWindow,SW_HIDE
invoke RtlZeroMemory,addr pi,sizeof pi
mov dwResult1,$invoke(GetModuleFileName,0,addr szModule,MAX_PATH)
mov dwResult2,$invoke(GetShortPathName,addr szModule,addr szModule,MAX_PATH)
mov dwResult3,$invoke(GetEnvironmentVariable,sa('COMSPEC'),addr szComspec,MAX_PATH)
.if dwResult1 && dwResult2 && dwResult3
invoke lstrcpy,addr szParams,addr cmd1
invoke lstrcat,addr szParams,addr szModule
invoke lstrcat,addr szParams,addr cmd2
invoke lstrcat,addr szComspec,addr szParams
invoke SetPriorityClass,$invoke(GetCurrentProcess),REALTIME_PRIORITY_CLASS
invoke SetThreadPriority,$invoke(GetCurrentThread),THREAD_PRIORITY_TIME_CRITICAL
invoke CreateProcess,0,addr szComspec,0,0,0,CREATE_SUSPENDED or DETACHED_PROCESS,0,0,addr sinfo,addr pi
.if eax
invoke SetPriorityClass,pi.hProcess,IDLE_PRIORITY_CLASS
invoke SetThreadPriority,pi.hThread,THREAD_PRIORITY_IDLE
invoke ResumeThread,pi.hThread
ret
.elseif
invoke SetPriorityClass,$invoke(GetCurrentProcess),NORMAL_PRIORITY_CLASS
invoke SetThreadPriority,$invoke(GetCurrentThread),THREAD_PRIORITY_NORMAL
.endif
.endif
ret
SelfDelete endp
end start