.386 .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive include BT01_Unpacker.inc .data hFile DD 00000000h UnpackedData DD 00000000h PackedData DD 00000000h NewFile DD 00000000h FileSize DD 00000000h UnpackedSize DD 00000000h str_exeFile DB "Virus.exe",0 str_NewexeFile DB "Unpacked_Virus.exe",0 Caption DB "Unpacking",0 Message DB "Done!",0 .code start: invoke GetPackedData, OFFSET str_exeFile Push UnpackedData Push PackedData Call UnPack Mov UnpackedSize, eax invoke CreateUnpackedFile, OFFSET str_exeFile invoke MessageBox, 0, ADDR Message, ADDR Caption, 0 ; Signale la fin de la décompression invoke VirtualFree, UnpackedData, 0, MEM_RELEASE invoke VirtualFree, PackedData, 0, MEM_RELEASE invoke VirtualFree, NewFile, 0, MEM_RELEASE invoke ExitProcess,0 ;######################################################################## UnPack proc near ; CODE XREF: sub_40330C+30p var_04 = dword ptr -4 arg_0 = dword ptr 4 arg_4 = dword ptr 8 pusha mov esi, [esp+20h+arg_0] mov edi, [esp+20h+arg_4] cld mov dl, 80h loc_4035BC: ; CODE XREF: UnPack+20j mov al, [esi] inc esi mov [edi], al inc edi mov ebx, 2 loc_4035C7: ; CODE XREF: UnPack+7Aj UnPack+C3j ... add dl, dl jnz short loc_4035D0 mov dl, [esi] inc esi adc dl, dl loc_4035D0: ; CODE XREF: UnPack+19j jnb short loc_4035BC add dl, dl jnz short loc_4035DB mov dl, [esi] inc esi adc dl, dl loc_4035DB: ; CODE XREF: UnPack+24j jnb short loc_40362C xor eax, eax add dl, dl jnz short loc_4035E8 mov dl, [esi] inc esi adc dl, dl loc_4035E8: ; CODE XREF: UnPack+31j jnb loc_4036C9 add dl, dl jnz short loc_4035F7 mov dl, [esi] inc esi adc dl, dl loc_4035F7: ; CODE XREF: UnPack+40j adc eax, eax add dl, dl jnz short loc_403602 mov dl, [esi] inc esi adc dl, dl loc_403602: ; CODE XREF: UnPack+4Bj adc eax, eax add dl, dl jnz short loc_40360D mov dl, [esi] inc esi adc dl, dl loc_40360D: ; CODE XREF: UnPack+56j adc eax, eax add dl, dl jnz short loc_403618 mov dl, [esi] inc esi adc dl, dl loc_403618: ; CODE XREF: UnPack+61j adc eax, eax jz short loc_403622 push edi sub edi, eax mov al, [edi] pop edi loc_403622: ; CODE XREF: UnPack+6Aj mov [edi], al inc edi mov ebx, 2 jmp short loc_4035C7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_40362C: ; CODE XREF: UnPack+2Bj mov eax, 1 loc_403631: ; CODE XREF: UnPack+95j add dl, dl jnz short loc_40363A mov dl, [esi] inc esi adc dl, dl loc_40363A: ; CODE XREF: UnPack+83j adc eax, eax add dl, dl jnz short loc_403645 mov dl, [esi] inc esi adc dl, dl loc_403645: ; CODE XREF: UnPack+8Ej jb short loc_403631 sub eax, ebx mov ebx, 1 jnz short loc_403678 mov ecx, 1 loc_403655: ; CODE XREF: UnPack+B9j add dl, dl jnz short loc_40365E mov dl, [esi] inc esi adc dl, dl loc_40365E: ; CODE XREF: UnPack+A7j adc ecx, ecx add dl, dl jnz short loc_403669 mov dl, [esi] inc esi adc dl, dl loc_403669: ; CODE XREF: UnPack+B2j jb short loc_403655 push esi mov esi, edi sub esi, ebp rep movs Byte ptr[edi], Byte ptr[esi] pop esi jmp loc_4035C7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_403678: ; CODE XREF: UnPack+9Ej dec eax shl eax, 8 mov al, [esi] inc esi mov ebp, eax mov ecx, 1 loc_403686: ; CODE XREF: UnPack+EAj add dl, dl jnz short loc_40368F mov dl, [esi] inc esi adc dl, dl loc_40368F: ; CODE XREF: UnPack+D8j adc ecx, ecx add dl, dl jnz short loc_40369A mov dl, [esi] inc esi adc dl, dl loc_40369A: ; CODE XREF: UnPack+E3j jb short loc_403686 cmp eax, 7D00h sbb ecx, 0FFFFFFFFh cmp eax, 500h sbb ecx, 0FFFFFFFFh cmp eax, 80h adc ecx, 0 cmp eax, 80h adc ecx, 0 push esi mov esi, edi sub esi, eax rep movs Byte ptr[edi], Byte ptr[esi] pop esi jmp loc_4035C7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_4036C9: ; CODE XREF: UnPack+38j mov al, [esi] inc esi xor ecx, ecx shr al, 1 jz short loc_4036EA adc ecx, 2 mov ebp, eax push esi mov esi, edi sub esi, eax rep movs Byte ptr[edi], Byte ptr[esi] pop esi mov ebx, 1 jmp loc_4035C7 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_4036EA: ; CODE XREF: UnPack+121j sub edi, [esp+20h+arg_4] mov [esp+20h+var_04], edi popa retn UnPack endp GetPackedData proc pPath: DWORD LOCAL FileSizeHigh : DWORD LOCAL BytesRead: DWORD invoke CreateFile, pPath, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 Mov hFile, eax invoke VirtualAlloc, 0, 1000h, MEM_COMMIT, PAGE_EXECUTE_READWRITE Mov PackedData, eax invoke VirtualAlloc, 0, 1000h, MEM_COMMIT, PAGE_EXECUTE_READWRITE Mov UnpackedData, eax invoke SetFilePointer, hFile, 0F19h, NULL, FILE_BEGIN invoke ReadFile, hFile, PackedData, 06E7h, ADDR BytesRead, 0 ; Récupère les données compressées invoke CloseHandle, hFile ret GetPackedData endp CreateUnpackedFile proc pPath: DWORD LOCAL FileSizeHigh : DWORD LOCAL BytesRead: DWORD invoke CreateFile, pPath, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 Mov hFile, eax invoke GetFileSize, hFile, ADDR FileSizeHigh Mov FileSize, eax invoke VirtualAlloc, 0, FileSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE Mov NewFile, eax invoke ReadFile, hFile, NewFile, FileSize, ADDR BytesRead, 0 invoke CloseHandle, hFile Mov eax, NewFile Lea edx, Dword ptr [eax+3Ch] ; edx = @PEHeader Mov edx, Dword ptr [edx] Add edx, eax ; edx = PEHeader Mov Dword ptr [edx+28h], 1004h ; Corrige l'EntryPoint Mov Dword ptr [edx+80h], 2010h ; Corrige l'ImportDirectoryRVA Add edx, 0F8h Push Dword ptr [UnpackedSize] Pop Dword ptr [edx+10h] ; Corrige la RSize de la 1ère section Mov Dword ptr [edx+14h], 400h ; Corrige le ROffset de la 1ère section Mov ebx, [UnpackedSize] Add edx, 28h ; Décale les sections suivantes pour prendre en compte Add [edx+14h], ebx ; la taille de la nouvelle section Add edx, 28h Add [edx+14h], ebx Add edx, 28h Add [edx+14h], ebx Mov ecx, 9 Lea edi, [eax+0442h] DecryptApiName: ; Décrypte le nom de l'api dans l'ImportTable Xor Byte ptr [edi], 0C5h Inc edi Loop DecryptApiName invoke CreateFile, OFFSET str_NewexeFile, GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 Mov hFile, eax invoke WriteFile, hFile, NewFile, 400h, ADDR BytesRead, NULL invoke WriteFile, hFile, UnpackedData, UnpackedSize, ADDR BytesRead, NULL Add Dword ptr [NewFile], 400h Sub Dword ptr [FileSize], 400h invoke WriteFile, hFile, NewFile, FileSize, ADDR BytesRead, NULL invoke CloseHandle, hFile ret CreateUnpackedFile endp end start