распаковщик с самым маленьким кодом

Тема в разделе "WASM.WIN32", создана пользователем ut2004, 26 фев 2007.

  1. ut2004

    ut2004 New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    5
    Всем привет.
    Исходные данные такие:
    код должен уместится в 79 байт, включая вызов VirtualAlloc + джамп на распакованный код.
    Существуют в природе подобные чудеса?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Распаковщик чего? VirtualAlloc где? - в импорте, или находить динамически?
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    ut2004
    Такс.... распаковщик или декриптор? У меня декрипторы в 14 байт обычно вмещались....

    А если распаковать нужно... Смотря какой алгоритм. И нужен ли словарь...
     
  4. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    VirtualAlloc + джамп на распакованный код у меня умещается в 70 байт, это при условии что адрес kernel32 и VirtualAlloc находятся динамически и то только для NT. Это значит что сам распаковщик должен быть 9 байт? :)
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Вот те код (откуда и у кого выдрал не знаю, но ему респект :))
    Код (Text):
    1. PCELZSS_Decompress proc stdcall src:DWORD, dest:DWORD
    2.     pushad
    3.     xor ebx,ebx                             ;ebx=ctrl_count
    4.     mov esi,src
    5.     movzx edx,byte ptr [esi]                ;edx=ctrl
    6.     inc esi
    7.     mov edi,dest
    8. NextByte:
    9.     bt edx,7
    10.     jc IsCodeWord
    11.     movsb
    12.     jmp Next
    13. IsCodeWord:
    14.     xor eax,eax
    15.     lodsb
    16.     shl eax,8
    17.     lodsb                              
    18.     mov ecx,eax                             ;eax=codeword
    19.     shr ecx,4                               ;ecx=phrase_index
    20.     jecxz Finished
    21.     push esi
    22.     mov esi,edi
    23.     sub esi,ecx
    24.     and eax,0Fh
    25.     inc eax
    26.     inc eax
    27.     mov ecx,eax
    28.     rep movsb
    29.     pop esi
    30. Next:
    31.     shl edx,1
    32.     inc ebx
    33.     cmp bl,8
    34.     jb NextByte
    35.     movzx edx,byte ptr [esi]                ;edx=ctrl
    36.     inc esi
    37.     xor ebx,ebx
    38.     jmp NextByte   
    39. Finished:  
    40.     mov eax,edi
    41.     sub eax,[dest]
    42.     mov dword ptr [esp+28],eax
    43.     popad
    44.     ret
    45. PCELZSS_Decompress endp
    46.  
    47.  
    48. SearchForPhrase proc stdcall string:DWORD, src:DWORD, max_len:DWORD, best_lenptr:DWORD
    49.     pushad
    50.     mov esi,[string]
    51.     mov edi,esi
    52.     mov bl,byte ptr [esi]
    53.     xor edx,edx             ;edx=best string
    54.     mov eax,[best_lenptr]
    55.     mov dword ptr [eax],1
    56.     dec esi
    57. NextByte:
    58.     cmp esi,[src]
    59.     jb Finished
    60.     cmp byte ptr [esi], bl
    61.     jnz NotHere
    62.     push esi
    63.     push edi
    64.     inc esi
    65.     inc edi
    66.     mov ecx,max_len
    67.     mov eax,ecx
    68.     repe cmpsb
    69.     sub eax,ecx
    70.     pop edi
    71.     pop esi
    72.     mov ecx,[best_lenptr]
    73.     cmp eax,[ecx]
    74.     jbe NotHere
    75.     mov [ecx],eax
    76.     mov edx,esi
    77. NotHere:
    78.     dec esi
    79.     jmp NextByte   
    80. Finished:
    81.     mov [esp+28],edx   
    82.     popad
    83.     ret
    84. SearchForPhrase endp
    85.  
    86.  
    87. PCELZSS_Compress proc stdcall src:DWORD, dest:DWORD, len:DWORD
    88.     local src_end:DWORD
    89.     local dest_end:DWORD
    90.     local phrase_ptr:DWORD
    91.     local lazy_ptr:DWORD
    92.     local ctrl_ptr:DWORD
    93.     local phrase_len:DWORD
    94.     local lazy_len:DWORD
    95.     local temp:DWORD
    96.     pushad
    97.     mov eax,[src]
    98.     add eax,[len]
    99.     mov [src_end],eax
    100.     mov eax,[dest]
    101.     add eax,[len]
    102.     sub eax,3
    103.     mov [dest_end],eax
    104.     xor eax,eax
    105.     mov [phrase_ptr],eax
    106.     cdq                             ;edx=ctrl
    107.     xor ebx,ebx                     ;ebx=ctrl_count
    108.     mov esi,[src]
    109.     mov edi,[dest]
    110.     mov [ctrl_ptr],edi
    111.     inc edi
    112. NextByte:
    113.     cmp esi,[src_end]
    114.     jge Finished
    115.     cmp edi,[dest_end]
    116.     jge Finished
    117.     inc ebx
    118.     cmp ebx,9
    119.     jnz StillBitsInCode
    120.     mov eax,[ctrl_ptr]
    121.     mov byte ptr [eax],dl
    122.     mov [ctrl_ptr],edi
    123.     inc edi
    124.     xor edx,edx
    125.     mov ebx,1
    126. StillBitsInCode:
    127.     mov ecx,[src_end]
    128.     sub ecx,esi
    129.     cmp ecx,15+2
    130.     jbe LenGood
    131.     mov ecx,15+2                        ;ecx=max_len
    132. LenGood:
    133.     mov eax,esi
    134.     sub eax,4095
    135.     cmp eax,[src]
    136.     jae WindowGood
    137.     mov eax,[src]
    138. WindowGood:
    139.     mov [temp],eax
    140.     cmp [phrase_ptr],0
    141.     jnz TestLazy
    142.     invoke SearchForPhrase,esi,[temp],ecx,addr phrase_len
    143.     mov [phrase_ptr],eax
    144. TestLazy:  
    145.     cmp ecx,2
    146.     jb CantTestLazy
    147.     inc esi
    148.     inc [temp]
    149.     invoke SearchForPhrase,esi,[temp],ecx,addr lazy_len
    150.     dec ecx
    151.     mov [lazy_ptr],eax
    152.     dec esi
    153. CantTestLazy:  
    154.     shl edx,1
    155.     cmp [phrase_ptr],0
    156.     jz code_literal
    157.     jecxz code_literal
    158.     cmp [lazy_ptr],0
    159.     jz code_word
    160.     mov eax,[lazy_len]
    161.     cmp eax,[phrase_len]
    162.     jbe code_word
    163. code_literal:  
    164.     push [lazy_ptr]
    165.     pop [phrase_ptr]
    166.     push [lazy_len]
    167.     pop [phrase_len]
    168.     movsb
    169.     jmp NextByte
    170. code_word: 
    171.     or edx,1
    172.     mov eax,esi
    173.     sub eax,[phrase_ptr]
    174.     shl eax,4
    175.     mov ecx,[phrase_len]
    176.     dec ecx
    177.     dec ecx
    178.     and ecx,0Fh
    179.     or eax,ecx
    180.     push eax
    181.     shr eax,8
    182.     stosb
    183.     pop eax
    184.     stosb
    185.     add esi,[phrase_len]
    186.     mov [phrase_ptr],0
    187.     jmp NextByte
    188. Finished:
    189.     inc ebx
    190.     shl edx,1
    191.     or edx,1
    192. TryNextBits:
    193.     cmp ebx,8
    194.     jae NoMoreBits
    195.     shl edx,1
    196.     inc ebx
    197.     jmp TryNextBits
    198. NoMoreBits:
    199.     mov eax,[ctrl_ptr]
    200.     mov byte ptr [eax],dl
    201.     xor eax,eax
    202.     stosw
    203.     sub edi,[dest]
    204.     mov [esp+28],edi
    205.     popad
    206.     ret
    207. PCELZSS_Compress endp
    Не знаю, скока тут байт, но вроде бы мало. Если при упаковке секцию с пакером расположить подальше от оригинальных секций, а еще свою готовую таблицу импорта там разместить, то, имхо, вполне можно вместиться.
     
  6. ut2004

    ut2004 New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    5