Полиморфный движок

Тема в разделе "WASM.BEGINNERS", создана пользователем teXture, 21 апр 2011.

  1. teXture

    teXture New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2011
    Сообщения:
    17
    Здравствуйте. Пытаюсь написать полиморфный движок для криптора. Код декриптора пишется прямо в исходник криптора и выделяется двумя макросами (move_begin и move_end). Перед этим инициализируются некоторые массивы, которые определяют какие инструкции требуется изменить. a_modi определяет какие регистры в инструкциях надо изменить (Dst,src,index или base). Накодил уже много, но чувствую, что чтото делаю не так. =(
    Мой алгоритм следующий:
    - В программе зашита таблица с оптимизированными опкодами, префиксами, опкодами где нужно изменить первый байт и где второй. Сравниваюсь с таблицей и выполняю определенное действие.
    - Перед таблицей добавляю код который изменят логику программы например при встрече опкода который оптимизируется (eax,ax,al). И опкодов которые (как мне кажется) обрабатываются не по правилам.
    - Функция modi_st изменяет первый байт инструкции если esi==0, если esi==1, то второй и т.д.

    Вопросы:
    1. Мне кажется, я явно чтото делаю не так, подскажите пожалуйста как реализовать это более компактно и правильно. Этих постоянных сравнений все больше и больше. Думаю мне надо переписать все нафиг. Или так и надо? =(
    2. Какие еще существуют оптимизированные опкоды для eax,ax,al помимо:
    add/or/adc/sbb/and/sub/xor/cmp/test eax/ax/al,const
    xchg eax,reg

    Код (Text):
    1. t_opop:
    2.         db 005h,004h,00Dh,00Ch,015h,014h,01Dh,01Ch,025h,024h,02Dh,02Ch,035h,034h,03Dh,03Ch
    3.         db 0A9h,0A8h
    4.         ; --------------------------------------------------------------------------------
    5.         ;add/or/adc/sbb/and/sub/xor/cmp/test eax/ax/al,const
    6. t_pref:
    7.         db 064h,065h,066h,067h,0F0h,0F2h,0F3h,02Eh,036h,03Eh,026h
    8. t_op_1:
    9.         db 040h,041h,042h,043h,044h,045h,046h,047h,048h,049h,04Ah,04Bh,04Ch,04Dh,04Eh,04Fh
    10.         db 050h,051h,052h,053h,054h,055h,056h,057h,058h,059h,05Ah,05Bh,05Ch,05Dh,05Eh,05Fh
    11.         db 090h,091h,092h,093h,094h,095h,096h,097h,0B0h,0B1h,0B2h,0B3h,0B4h,0B5h,0B6h,0B7h
    12.         db 0B8h,0B9h,0BAh,0BBh,0BCh,0BDh,0BEh,0BFh
    13.         ; --------------------------------------------------------------------------------
    14.         ; inc,dec r32/r16 || push,pop r32/r16/r8
    15.         ; xchg eax/ax/al,r32/r16/r8 || mov r32/r16/r8,const
    16. t_op_2:
    17.         db 013h,012h,011h,010h,003h,002h,001h,000h,023h,022h,021h,020h,03Bh,03Ah,039h,038h
    18.         db 08Bh,08Ah,089h,088h,00Bh,00Ah,009h,008h,01Bh,01Ah,019h,018h,02Bh,02Ah,029h,028h
    19.         db 033h,032h,031h,030h,087h,086h,085h,084h,0F7h,0F6h,0F5h,0F4h,0FEh,00Fh,0D3h,0FFh
    20.         db 080h,081h,083h
    21.         ; --------------------------------------------------------------------------------
    22.         ; adc/add/and/cmp/mov/or/sbb/sub/xor/xchg/test r32/r16/r8,r32/r16/r8/modrm\sib
    23.         ; not/neg/mul/imul/div/idiv r32/r16/r8 || inc/dec r8 || bswap r32
    24.         ; ror/rol/rcl/rcr/sar/sal/shr/shl r32/r16,cl || jmp r32/r16 || call r32/r16
    25. t_end:
    26.  
    27. ; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    28.  
    29. modi_st proc
    30.  
    31.             test ah,ah
    32.             je @F
    33.             and byte ptr [buff_for_op+esi],11000111b
    34.              .if ah == 0FFh
    35.               not ah
    36.              .endif
    37.             shl ah,3
    38.             or byte ptr [buff_for_op+esi],ah
    39. @@:         test al,al
    40.             je @F            
    41.             and byte ptr [buff_for_op+esi],11111000b
    42.              .if al == 0FFh
    43.               not al
    44.              .endif
    45.             or byte ptr [buff_for_op+esi],al
    46. @@:         movzx eax,byte ptr [buff_for_op+esi]
    47.             mov edi,eax
    48.             and edi,11000000b
    49.             shr edi,6                                     ; mode
    50.             and eax,00000111b                             ; mem/reg
    51.              .if edi<3 && eax==100b
    52.              ; swapping SIB structure:
    53.               inc esi
    54.               test ch,ch
    55.               je @F
    56.               and byte ptr [buff_for_op+esi],11000111b
    57.                .if ch == 0FFh
    58.                 not ch
    59.                .endif
    60.               shl ch,3
    61.               or byte ptr [buff_for_op+esi],ch
    62. @@:           test cl,cl
    63.               je @F            
    64.               and byte ptr [buff_for_op+esi],11111000b
    65.                .if cl == 0FFh
    66.                 not cl
    67.                .endif
    68.               or byte ptr [buff_for_op+esi],cl
    69. @@:          .endif          
    70.             ret
    71.  
    72. modi_st endp
    73.  
    74. modif proc
    75. LOCAL pr:BYTE
    76.  
    77.             push eax
    78.             mov pr,bl
    79.            
    80.             ; DELETE PREFIXES:
    81.             mov eax,offset t_pref                  
    82.              .while eax != offset t_op_1
    83.               mov cl,byte ptr [eax]
    84.                .if cl == byte ptr [buff_for_op]
    85.                 mov byte ptr [a_pref+ebx],cl
    86.                 mov edi,offset buff_for_op          ; dst
    87.                 mov esi,offset buff_for_op          ; src
    88.                 inc esi
    89.                 dec byte ptr [a_leng+edx]
    90.                 movzx ecx,byte ptr [a_leng+edx]
    91.                 rep movsb
    92.                 mov eax,offset t_pref
    93.                 inc ebx
    94.                 dec eax
    95.                 inc pr
    96.                .endif
    97.               inc eax
    98.              .endw
    99.              
    100.             ; INITIALIZATION:
    101.             xor esi,esi                                                    
    102.             mov ah,byte ptr [a_modi+edx*4]          ;-
    103.             mov al,byte ptr [a_modi+edx*4+1]        ; |>  |ah|al|ch|cl|--|bl|
    104.             mov ch,byte ptr [a_modi+edx*4+2]        ; |   |ds|sr|in|ba|--|le|
    105.             mov cl,byte ptr [a_modi+edx*4+3]        ; |  
    106.             mov bl,byte ptr [a_leng+edx]            ;-
    107.            
    108.             ; MODIFICATION FOR OPTIMIZATION OPCODE:
    109.             mov edi,offset t_opop                  
    110.             mov bh,byte ptr [buff_for_op]
    111.              .while bh != byte ptr [edi]
    112.               inc edi
    113.                .if edi == offset t_pref
    114.                 jmp next
    115.                .endif
    116.              .endw
    117.             .if al!=0FFh
    118.              mov bh,byte ptr [buff_for_op+4]        ; shift right
    119.              mov byte ptr [buff_for_op+5],bh
    120.              mov esi,dword ptr [buff_for_op]
    121.              mov dword ptr [buff_for_op+1],esi
    122.               .if byte ptr [buff_for_op]==0A9h || byte ptr [buff_for_op]==0A8h
    123.                mov byte ptr [buff_for_op],0F7h
    124.                mov byte ptr [buff_for_op+1],0C0h
    125.                jmp LB
    126.               .endif
    127.              mov byte ptr [buff_for_op],080h
    128.              mov bh,byte ptr [buff_for_op+1]
    129.              bt ebx,9
    130.              jae @F
    131. @@:          inc byte ptr [buff_for_op]             ; first byte 080h, maybe 081h or 0F7h (test)
    132.              add byte ptr [buff_for_op+1],0BBh      ; second byte
    133. LB:          or byte ptr [buff_for_op+1],al
    134.              inc byte ptr [a_leng+edx]              ; add length
    135.              inc bl
    136.             .endif
    137.             jmp skip
    138.              
    139.              
    140.              
    141.            
    142. next:        .if byte ptr [buff_for_op]==87h && ah==0FFh && bl==2 && al!=ah || byte ptr [buff_for_op]==87h && al==0FFh && bl==2 && al!=ah
    143.              ; xchg eax/ax,r32/r16 -> 9?h
    144.               dec byte ptr [a_leng+edx]
    145.               dec bl
    146.               mov byte ptr [buff_for_op],90h
    147.               mov ch,byte ptr [buff_for_op+1]
    148.               and ch,00111111b
    149.               mov cl,ch
    150.               shr ch,3                              ; dst from opcode
    151.               and cl,00000111b                      ; src from opcode
    152.                .if ah==0FFh
    153.                 .if cl!=0 && al==0
    154.                  or byte ptr [buff_for_op],cl
    155.                 .else
    156.                  or byte ptr [buff_for_op],al
    157.                 .endif
    158.                .elseif al==0FFh
    159.                 .if ch!=0 && ah==0
    160.                  or byte ptr [buff_for_op],ch
    161.                 .else
    162.                  or byte ptr [buff_for_op],ah
    163.                 .endif
    164.                .endif
    165.               jmp skip
    166.              .elseif byte ptr [buff_for_op]==87h && al==ah
    167.              ; xchg x,x -> nop
    168.               dec byte ptr [a_leng+edx]
    169.               dec bl
    170.               mov byte ptr [buff_for_op],90h
    171.               jmp skip
    172.              .elseif byte ptr [buff_for_op]>8Fh && byte ptr [buff_for_op]<98h && bl==1 && ah!=0
    173.              ; 9?h -> xchg eax/ax,r32/r16
    174.               inc byte ptr [a_leng+edx]
    175.               inc bl
    176.               mov cl,byte ptr [buff_for_op]
    177.               and cl,00000111b                       ; src from opcode
    178.               mov word ptr [buff_for_op],0C087h
    179.                .if ah!=0FFh && al!=0FFh && ah!=0 && al!=0
    180.                 and byte ptr [buff_for_op+1],11111000b
    181.                 shl ah,3
    182.                 or byte ptr [buff_for_op+1],ah
    183.                 or byte ptr [buff_for_op+1],al
    184.                .elseif ah!=0FFh && cl!=0 && al==0
    185.                 shl ah,3
    186.                 or byte ptr [buff_for_op+1],ah
    187.                 or byte ptr [buff_for_op+1],cl
    188.                .else
    189.                 dec byte ptr [a_leng+edx]
    190.                 dec bl
    191.                 mov byte ptr [buff_for_op],90h
    192.                  .if al==0FFh
    193.                   not al
    194.                  .endif
    195.                  .if ah==0FFh
    196.                   not ah
    197.                  .endif
    198.                 .if cl==0
    199.                  or byte ptr [buff_for_op],al
    200.                 .else
    201.                  or byte ptr [buff_for_op],cl
    202.                 .endif
    203.                 or byte ptr [buff_for_op],ah
    204.                .endif
    205.               jmp skip
    206.              .elseif byte ptr [buff_for_op]==0F7h && byte ptr [buff_for_op+1]>0C0h && byte ptr [buff_for_op+1]<0C8h && bl==6
    207.              ; test r32/r16,const
    208.              or byte ptr [buff_for_op+1],al
    209.              .endif
    210.            
    211.  
    212. SR:         ; SWAPPING REGISTERS:
    213.             mov edi,offset t_op_1                  
    214.             mov bh,byte ptr [buff_for_op]
    215.              .while bh != byte ptr [edi]
    216.               inc edi
    217.                .if edi == offset t_end
    218. ER:             add esp,28
    219.                 jmp _error_2                        ; error (unknown opcode for modification)
    220.                .endif
    221.              .endw
    222.               .if word ptr [buff_for_op]>3F0Fh && word ptr [buff_for_op]<500Fh || word ptr [buff_for_op]>08F0Fh && word ptr [buff_for_op]<0A00Fh || word ptr [buff_for_op]==0A30Fh || word ptr [buff_for_op]==0AB0Fh || word ptr [buff_for_op]>0AF0Fh && word ptr [buff_for_op]<0C20Fh
    223.               ; stub for expanded opcodes:
    224.               ; movsx r32,r16/r8 || movsx r16,r8 || movzx r32,r16/r8 || movzx r16,r8 || cmovcc r32/r16,r32/r16
    225.               ; xadd r32/r16/r8,r32/r16/r8 || cmpxchg r32/r16/r8,r32/r16/r8 || bt r32/r16,r32/r16 || bts r32/r16,r32/r16
    226.               ; btr r32/r16,r32/r16 || btc r32/r16,r32/r16 || bsf r32/r16,r32/r16 || bsr r32/r16,r32/r16 || setcc r8
    227.                inc esi
    228.                inc esi
    229.                 .if word ptr [buff_for_op]==0C10Fh || word ptr [buff_for_op]==0C00Fh  || word ptr [buff_for_op]==0B10Fh || word ptr [buff_for_op]==0B00Fh || word ptr [buff_for_op]==0A30Fh || word ptr [buff_for_op]==0AB0Fh || word ptr [buff_for_op]==0B30Fh || word ptr [buff_for_op]==0BB0Fh
    230.                  ; reverse order operands for next opcodes:
    231.                  ; xadd r32/r16/r8,r32/r16/r8 || cmpxchg r32/r16/r8,r32/r16/r8 || bt r32/r16,r32/r16
    232.                  ; bts r32/r16,r32/r16 || bts r32/r16,r32/r16 || btr r32/r16,r32/r16 || btc r32/r16,r32/r16
    233.                  ; btr r32/r16,r32/r16 || btc r32/r16,r32/r16
    234.                  xchg ah,al
    235.                 .endif
    236.               .elseif edi>=t_op_2
    237.                inc esi
    238.               .endif
    239.             call modi_st
    240.            
    241.             ; PAST PREFIXES:
    242. skip:       xor eax,eax                            
    243.              .while pr != NULL
    244.               movzx ecx,byte ptr [a_leng+edx]
    245.                .while (ecx!=-1)
    246.                 mov bl,byte ptr [buff_for_op+ecx]
    247.                 mov byte ptr [buff_for_op+ecx+1],bl
    248.                 dec ecx
    249.                .endw
    250.               movzx eax,pr
    251.               mov bl,byte ptr [a_pref+eax-1]
    252.               mov byte ptr [buff_for_op],bl
    253.               inc byte ptr [a_leng+edx]
    254.               dec pr
    255.              .endw
    256.              
    257.             mov esi,offset buff_for_op              ; src
    258.             movzx ecx,byte ptr [a_leng+edx]         ; length
    259.             pop eax
    260.             xor ebx,ebx
    261.             ret
    262.  
    263. modif endp
    264.  
    265. move_code proc
    266.  
    267.             push esi
    268.             push edi
    269.  
    270.             xor eax,eax
    271.            .while (dword ptr [a_offs+eax*4]!=ebx)  ; this loop set order
    272.              .if byte ptr [a_repl+eax] == bl
    273.               mov byte ptr [a_repl+eax],al
    274.              .elseif byte ptr [a_repl+eax] == 0FFh
    275.               mov byte ptr [a_repl+eax],bl
    276.              .endif
    277.             inc eax
    278.            .endw
    279.            
    280.             xor eax,eax                             ; main counter
    281.             xor edx,edx                             ; pointer on current opcode
    282.            
    283.            
    284.            .while (dword ptr [a_offs+eax*4]!=ebx)
    285.            
    286.             movzx edx,byte ptr [a_repl+eax]         ; get pointer on current opcode
    287.             mov esi,dword ptr [a_offs+edx*4]        ; src
    288.             movzx ecx,byte ptr [a_leng+edx]         ; length
    289.            
    290.              .if dword ptr [a_modi+edx*4] != ebx
    291.              ; // modification \\
    292.               ;.if byte ptr [a_modi+edx*2] == 0FFh            
    293.               ; mov byte ptr [a_modi+edx*2],bl
    294.               ;.endif
    295.               mov edi,offset buff_for_op            ; dst
    296.               rep movsb
    297.               call modif
    298.              .endif
    299.            
    300.            
    301.            
    302.            
    303.             mov edi,Delta                           ; dst
    304.             add Delta,ecx
    305.             rep movsb                               ; move code
    306.             inc eax
    307.            .endw
    308.  
    309.             pop edi
    310.             pop esi
    311.             ret
    312.            
    313. move_code endp