Пожать еще немного несжимаемый PE

Тема в разделе "WASM.WIN32", создана пользователем Dmitry_Milk, 9 авг 2018.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Есть сделанный на асме EXE-шник под win32 размером в несколько десятков килобайт, причем больше половины в нем - высокоэнтропийные данные (нет, не результат архиватора, но оптимальное кодирование данных и подбор инструкций). Попытка еще больше пожать в лоб PE-архиватором (конкретно я пробовал UPX) обламывается сообщением, что, мол, файл несжимаемый. Но при этом вижу, что у меня почти килобайт нулей в PE-заголовке. Вроде когда-то мне попадалась информация, что можно как-то оптимизировать PE-заголовок (люди как-то умудрялись делать черезвычайно маленькие экзешники, меньше стандартного размера PE-заголовка).
    Подскажите, что именно и как там оптимизируется и сколько я смогу выиграть? Хочется понять, стоит ли тратить на это время. Экзешник состоит всего из двух реальных секций (фактически все секция кода + секция импорта) и виртуальной секции неинициализированных данных.
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.953
    А заголовок пакеры не сжимают, он как бы грузится несколько раньше кода распаковщика. Первое направление - уменьшить dos-заголовок, это позволит несколько байт сэкономить (format pe gui 4.0 on 'stub.bin' в фасме, сам файл 5 байт B8 01 4C CD 21), второе - алигнменты, то бишь выравнивания пересчитать. Посмотри эту например утилиту.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Dmitry_Milk нравится это.
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Есть пакеры, которые сжимают (оптимизируют, стриппят) и заголовок тоже. В пакованном файле сразу идет MZpackername. Вот пакернейм я, увы, забыл.

    Также можно посмотреть Kkrunchy, который эффективно жмет именно код.
     
    Последнее редактирование: 10 авг 2018
    q2e74, Dmitry_Milk и Mikl___ нравится это.
  5. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    (Win)Upack * http://wex.cn/dwing
    Код (DOS):
    1. EP minidump:
    2. ---------|------------+-----------+-----------+-----------|----+---+---+----
    3. 00000010:  50 45 00 00 4C 01 03 00 BE B0 11 40 00 AD 50 FF  PE..L...╛░.@.нP
    4. 00000020:  76 34 EB 7C 48 01 0F 01 0B 01 4C 6F 61 64 4C 69  v4ы|H.....LoadLi
    5. 00000030:  62 72 61 72 79 41 00 00 18 10 00 00 10 00 00 00  braryA..........
    6. 00000040:  00 10 1F 00 00 00 40 00 00 10 00 00 00 02 00 00  ......@.........
    7. 00000050:  04 00 00 00 00 00 3A 00 04 00 00 00 00 00 00 00  ......:.........
    8. ---------|------------+-----------+-----------+-----------|----+---+---+----
    9.  
    Код (DOS):
    1. ##        ss  Section     Offset    VA         Event             ASCII      T Method
    2. --------  --  ----------  --------  ---------  --------          -----      - --------
    3. 00000001  01  [PS ╒лыч├]  00000000  .00401000  MZKERNEL32.DLL..PE..         A Executable!: EXE MZ Header (PE) Signature (Packed with (Win)Upack * http://wex.cn/dwing { 0000 }
    4. 00000002  01  [PS ╒лыч├]  00000018  .00401018  BEB0114000AD50FF7634EB7C48     -->> EP: Packer: (Win)Upack 0.399 * http://wex.cn/dwing
    5. 00000003  01  [PS ╒лыч├]  0000002A  .0040102A  LoadLibrary                  A 'LoadLibraryA' { 000C }
    6. 00000004  01  [PS ╒лыч├]  000000C0  .004010C0  GetProcAddress               A 'GetProcAddress' { 000E }
    7.  
     
    Dmitry_Milk и _edge нравится это.
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Dmitry_Milk,

    > Но при этом вижу, что у меня почти килобайт нулей в PE-заголовке.

    Не жмётся хидер так как он нужен в исходном виде для загрузчика. Это решается загрузкой из памяти, там образ может быть любыми данными. Но для этого нужен опять же загружающий модуль.
     
  7. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Последнее редактирование: 25 авг 2018
  8. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    http://www.codenet.ru/progr/visualc/esmall.php

    Можно объединить секции и подредактировать PE-заголовок, но, если не секрет, зачем это может быть нужно в наше время?
     
  9. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Mikl___, круто сжал в своё время.. а дальше - некуда,
    если сжать секцию-кода меньше 200h, то она становится доступная на запись
    т.е. атрибуты анулируются
     
  10. DelAlt

    DelAlt Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    62
    Што?
     
  11. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Crinkler весьма неплох. Но им надо линковать.
    --- Сообщение объединено, 4 мар 2019 ---
    У меня получалось линковать obj-файл, сгенерированый FASM`ом.
     
  12. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Для компактного файла, я использую линкер PoLink.exe.
     
  13. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    upx имеет опцию --lzma - дополнительно процентов 15 получите
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    ECk,

    А зачем нужен сечас upx ?
    На нём обучаются отладке, больше он не для чего не нужен.
     
  15. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Это к ТС вопрос