Упаковщик KPack

...
  • А как насчёт скорости распаковки? Ведь программы такого рода должны нен только хорошо запаковывать, но и быстро распаковывать.
  • aPLib и LZMA (как и все LZ-based алгоритмы) характеризуются очень быстрой распаковкой.
  • Скачайте заново со ссылок выше Windows-версию - там есть пара небольших изменений.
    Kolibri-версия:
    http://shade.msu.ru/~msu-se/mtappack
    http://shade.msu.ru/~msu-se/mtappack_kolibri_src.rar
  • diamond
    Обнаружил такое ограничение - FASM упакованный MTAPPACK отказывается компилировать. На доске отладке пишет, что не хватает памяти.
  • Вероятно, MTAPPACK выделяет распакованному FASM недостаточно памяти
  • А может дело в самом FASM'е?
  • mike.dld
    При упаковке MXP такой проблемы нету, по этому это глюк не фасм, а упаковщика.
  • Используйте ключ /0 Windows-версии, эквивалентный ключу -0 Kolibri-версии и флажку "force memory size increase".
    Это увеличивает размер памяти, используемой приложением, но неинициализированные данные зануляются (без ключа в неинициализированных данных будет мусор). У других упаковщиков этого нет, поскольку они безусловно добавляют память.
  • diamond
    А несложно в Колибри версию добавить управляющих элементов для выбора параметров в графическом виде?
  • Да, действительно, после упаковки с помощью MXP программа требует примерно на 200-400 байт больше :)

    Вот stub для MXP-LZO... У NRV почти такой же.

    Code: Select all

    ; ===========================================================================
    ;                      Menuet eXecutable Packer 0.10
    ; ===========================================================================
    ;    Coded by Ivan Poddubny
    ;    Based on picoLZO for C-- by Kai-Hong Chen
    ;
    ;    miniLZO -- mini subset of the LZO real-time data compression library
    ;
    ;    Markus F.X.J. Oberhumer
    ;    <markus@oberhumer.com>
    ;    http://www.oberhumer.com/opensource/lzo/
    ;
    ; ===========================================================================
    
    ; ===[ IDEA ]================================================================
    ;
    ; 1) copy [decompression routine + compressed program]
    ;      out of the original program memory area
    ; 2) decompress all the stuff RIGHT to the header (i.e. offset = 0x0)
    ; 3) set the new stack to [stack_ptr] from the restored header
    ; 4) free memory used by moved & compressed image, decompressor remains there
    ; 5) jump to [entry_point] from the decompressed header
    ;
    ; ===[ HEADER ]==============================================================
    
      use32
      org 0x0
    
      include "MACROS.INC"
    
                      db 'MENUET01'
      temp_value      dd 1
      entry_point     dd START
      file_size       dd 0     ; stub + compr
      memory_size     dd 0     ; stub + compr + oldmem + 0x1000
      stack_ptr       dd 0     ; stub + compr + oldmem + 0x1000
      param_area      dd 0     ; this stub doesn't use parameters
      tmp_area        dd 0     ; oldmem
      compr_size      dd 0
    
    
    ; ===[ CODE ]================================================================
    
    START:
            xor     eax, eax
    
            mov     ecx, decompr_size
            mov     [eax], ecx
            add     ecx, [eax + compr_size]
    
            mov     esi, decompressor
            mov     edi, [eax + tmp_area]
            push    edi
            rep     movsb
    
            jmp     dword [esp]
    
    decompressor:
            pop     esi
            add     esi, [eax]
            xor     edi, edi
    
            include "UNPACK.ASM"
    
            xor     eax, eax
            mov     esp, [eax + stack_ptr]
    
            mov     ecx, decompr_size
            add     ecx, [eax + memory_size]
            inc     eax                       ; eax equaled 0, now it contains  1
            xchg    eax, ebx                  ; ebx = 1
            mov     eax, 64                   ; eax = 64 - resize memory
            int     0x40
    
            ; 0x40 should return zero in eax
            jmp     [eax+entry_point]
    decompr_size = $ - decompressor
    
    compr_ptr:
  • Mario79
    Каких параметров?
    Иван Поддубный
    Дополнительная память требуется не только для stub'а, но и для упакованных данных, а их обычно существенно больше, чем 200-400 байт
  • [offtop]
    Кстати о глюках fasm'a: Kolibri-версия при компиляции формата PE не записывает в файл MZ-заглушку (обнаружено при тестировании эмулятора на исходниках эмулятора)
    [/offtop]
  • diamond
    А как ты думаешь - ведь неудобно запускать каждый раз из консоли твой упаковщик с параметром. Может быть, стоит для Колибри сделать выбор и в графическом виде.
  • Mario79
    Так уже давно есть соответствующий флажок "force memory size increasing, zero uninit data"...
  • Who is online

    Users browsing this forum: No registered users and 3 guests