Есть сделанный на асме EXE-шник под win32 размером в несколько десятков килобайт, причем больше половины в нем - высокоэнтропийные данные (нет, не результат архиватора, но оптимальное кодирование данных и подбор инструкций). Попытка еще больше пожать в лоб PE-архиватором (конкретно я пробовал UPX) обламывается сообщением, что, мол, файл несжимаемый. Но при этом вижу, что у меня почти килобайт нулей в PE-заголовке. Вроде когда-то мне попадалась информация, что можно как-то оптимизировать PE-заголовок (люди как-то умудрялись делать черезвычайно маленькие экзешники, меньше стандартного размера PE-заголовка). Подскажите, что именно и как там оптимизируется и сколько я смогу выиграть? Хочется понять, стоит ли тратить на это время. Экзешник состоит всего из двух реальных секций (фактически все секция кода + секция импорта) и виртуальной секции неинициализированных данных.
А заголовок пакеры не сжимают, он как бы грузится несколько раньше кода распаковщика. Первое направление - уменьшить dos-заголовок, это позволит несколько байт сэкономить (format pe gui 4.0 on 'stub.bin' в фасме, сам файл 5 байт B8 01 4C CD 21), второе - алигнменты, то бишь выравнивания пересчитать. Посмотри эту например утилиту.
Dmitry_Milk, например так Сказки дядюшки Римуса → Глава вторая. Как Братец Кролик уменьшал размер программы
Есть пакеры, которые сжимают (оптимизируют, стриппят) и заголовок тоже. В пакованном файле сразу идет MZpackername. Вот пакернейм я, увы, забыл. Также можно посмотреть Kkrunchy, который эффективно жмет именно код.
(Win)Upack * http://wex.cn/dwing Код (DOS): EP minidump: ---------|------------+-----------+-----------+-----------|----+---+---+---- 00000010: 50 45 00 00 4C 01 03 00 BE B0 11 40 00 AD 50 FF PE..L...╛░.@.нP 00000020: 76 34 EB 7C 48 01 0F 01 0B 01 4C 6F 61 64 4C 69 v4ы|H.....LoadLi 00000030: 62 72 61 72 79 41 00 00 18 10 00 00 10 00 00 00 braryA.......... 00000040: 00 10 1F 00 00 00 40 00 00 10 00 00 00 02 00 00 ......@......... 00000050: 04 00 00 00 00 00 3A 00 04 00 00 00 00 00 00 00 ......:......... ---------|------------+-----------+-----------+-----------|----+---+---+---- Код (DOS): ## ss Section Offset VA Event ASCII T Method -------- -- ---------- -------- --------- -------- ----- - -------- 00000001 01 [PS ╒лыч├] 00000000 .00401000 MZKERNEL32.DLL..PE.. A Executable!: EXE MZ Header (PE) Signature (Packed with (Win)Upack * http://wex.cn/dwing { 0000 } 00000002 01 [PS ╒лыч├] 00000018 .00401018 BEB0114000AD50FF7634EB7C48 -->> EP: Packer: (Win)Upack 0.399 * http://wex.cn/dwing 00000003 01 [PS ╒лыч├] 0000002A .0040102A LoadLibrary A 'LoadLibraryA' { 000C } 00000004 01 [PS ╒лыч├] 000000C0 .004010C0 GetProcAddress A 'GetProcAddress' { 000E }
Dmitry_Milk, > Но при этом вижу, что у меня почти килобайт нулей в PE-заголовке. Не жмётся хидер так как он нужен в исходном виде для загрузчика. Это решается загрузкой из памяти, там образ может быть любыми данными. Но для этого нужен опять же загружающий модуль.
Добавлю немножко, http://www.phreedom.org/research/tinype/ Также, разная, в том числе, ПЕ-матчасть, на нескольких страницах, от Corkami, https://code.google.com/archive/p/corkami/downloads
http://www.codenet.ru/progr/visualc/esmall.php Можно объединить секции и подредактировать PE-заголовок, но, если не секрет, зачем это может быть нужно в наше время?
Mikl___, круто сжал в своё время.. а дальше - некуда, если сжать секцию-кода меньше 200h, то она становится доступная на запись т.е. атрибуты анулируются
Crinkler весьма неплох. Но им надо линковать. --- Сообщение объединено, 4 мар 2019 --- У меня получалось линковать obj-файл, сгенерированый FASM`ом.