;*******************************************************
;ml /c /coff /Fo selfkill-Rnt.obj selfkill-Rnt.asm
;Link /subsystem:windows /SECTION:.text,WRE selfkill-Rnt.obj
;*******************************************************
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;*******************************************************
.code
;删除自身的远程线程代码
KREMOTE_CODE_START equ this byte
call @F
@@:
pop ebx
sub ebx,offset @B ;重定位
push 500
call [ebx+_lpselfkillSleep]
lea eax,[ebx+offset _selfkillselfname]
push eax
call [ebx+_lpselfkillDeleteFile]
ret
_lpselfkillSleep dd ?
_lpselfkillDeleteFile dd ?
_selfkillselfname:
KREMOTE_CODE_END equ this byte
KREMOTE_CODE_LENGTH equ offset KREMOTE_CODE_END - offset KREMOTE_CODE_START
;*******************************************************
.data?
REMOTE_CODE db KREMOTE_CODE_LENGTH dup (?)
szSelfName db MAX_PATH dup (?)
.code
;*******************************************************
;用于在explorer.exe进程中插入远程线程
szDesktopClass db 'Progman',0
szDesktopWindow db 'Program Manager',0
_RemoteCode2KXP proc @_RmCodeStart,@_RmCodeLen
local @hRmCodeMemory
local @hselfkillProcessID
local @hselfkillProcess
;查找文件管理器窗口并获取进程ID,然后打开进程
invoke FindWindow,addr szDesktopClass,addr szDesktopWindow
lea ecx,@hselfkillProcessID
invoke GetWindowThreadProcessId,eax,ecx
invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,FALSE,@hselfkillProcessID
mov @hselfkillProcess,eax
;在进程中分配空间并将写入远程代码,建立远程线程
invoke VirtualAllocEx,@hselfkillProcess,NULL,@_RmCodeLen,MEM_COMMIT,PAGE_EXECUTE_READWRITE
.if eax
mov @hRmCodeMemory,eax
invoke WriteProcessMemory,@hselfkillProcess,eax,@_RmCodeStart,@_RmCodeLen,NULL
xor eax,eax
invoke CreateRemoteThread,@hselfkillProcess,eax,eax,@hRmCodeMemory,eax,eax,eax
invoke CloseHandle,eax
.endif
invoke CloseHandle,@hselfkillProcess
ret
_RemoteCode2KXP endp
;*******************************************************
szselfkillDllKernel db 'Kernel32.dll',0
szselfkillSleep db "Sleep",0
szselfkillDeleteFile db "DeleteFileA",0
start:
;取得API地址(硬编码地址)
invoke GetModuleHandle,addr szselfkillDllKernel
mov esi,eax
invoke GetProcAddress,esi,offset szselfkillSleep
mov _lpselfkillSleep,eax
invoke GetProcAddress,esi,offset szselfkillDeleteFile
mov _lpselfkillDeleteFile,eax
;把远程代码和自身地址合并
cld
mov ecx,KREMOTE_CODE_LENGTH
mov esi,offset KREMOTE_CODE_START
mov edi,offset REMOTE_CODE
rep movsb
invoke GetModuleFileName,NULL,offset szSelfName,MAX_PATH
push KREMOTE_CODE_LENGTH+MAX_PATH
push offset REMOTE_CODE
call _RemoteCode2KXP
ret
end start