Logo

PE Tool

Если вы пишете на Delphi и задумывались над уменьшением размеров исполнимого файла, но не хотите использовать сжатие, то наверняка знаете про программы вроде StripReloc, умеющие вырезать перемещаемые символы из exe-файлов. Однако после этого в файлах может оставаться другая избыточная информация, избавиться от которой можно только пересборкой файла.
        /\_/\
    .__/ o o \    PE Tool 0.6
   /~__;==t==/    Copyright © 2013-2018, 2020 Vladislav Javadov
  (_____)_m_m)

         Loading  [...]tregsvr.exe          983703 bytes  100.0%
      Image data                            985088 bytes  100.1%
  Replacing stub  C:\Tools\Pet.exe            -960 bytes  -93.8%
       Stripping                           -911750 bytes  -92.6%
          Saving  tregsvr.exe                73338 bytes    7.5%
           Total                           -910365 bytes  -92.5%

Image/machine/subsystem type  PE/x86/Console
        OS/subsystem version  4.0/4.0
                  Image base  00400000
        Stack commit/reserve  4000/100000
         Heap commit/reserve  1000/100000
Section alignment (file/RVA)  200/1000

Headers and sections (file/RVA)
     {stub}  00000/00000         64 bytes    0.0%
  {headers}  00040/00040        448 bytes    0.0%
       CODE  00200/01000      61952 bytes    6.3%  ·C·········XR·
       DATA  0F400/11000       2048 bytes    0.2%  ··D·········RW
     .idata  0FC00/13000       3072 bytes    0.3%  ··D·········RW
     .rdata  10800/15000        512 bytes    0.1%  ··D·······S·R·
      .rsrc  10A00/18000       5242 bytes    0.5%  ··D·······S·R·
GitHub logo

PE Tool — утилита пересборки файлов

PE Tool — утилита оптимизации PE-файлов путем их пересборки, без сжатия. Реализованы следующие оптимизации:
  • Уменьшение заголовков PE за счет сокращения неиспользуемых записей каталога данных (data directory).
  • Вырезание отладочной информации, прикрепленных данных, пустых секций и секций без ссылок на них (ключ -deep).
  • Вырезание перемещаемых символов (relocations) и секции экспорта из exe-файлов.
  • Удаление секций, заданых ключом -dropsect.
  • Замена DOS-заглушки (stub) любой программой DOS или вытащенной на лету заглушкой другого PE-файла. Сама PE Tool имеет заглушку размером 60 байт, которую можно использовать по умолчанию.
  • Обрезка секций по фактическим данным, с вырезанием повторяющиейся строки PADDINGXXPADDING, добавляемой системной функцией UpdateResource при внедрении манифеста.
  • Выравнивание секций на минимально возможное значение — 512 байт.
  • Обрезка файла по границе фактических данных при сохранении — ключ -trunc.
Дополнительные возможности:
  • Установка требуемой версии ОС — ключ -osver.
  • Установка флага LARGE_ADDRESS_AWARE — ключ -3gb.
  • Установка флага динамической базы образа (ALSR) — ключ -aslr.
  • Установка флага совместимости с DEP (NX-битом) — ключ -dep.
  • Вывод информации о файле и его секциях — ключ -ls.

Вызов программы

pet -strip -trunc -stub . MyFile.exe -into MyFile-stripped.exe
В процессе обработки выводится подробная статистика:
       Loading  tregsvr.exe             983703 bytes  100.0%
    Image data                          985088 bytes  100.1%
Replacing stub  C:\Tools\Pet.exe          -960 bytes  -93.8%
     Stripping                         -911750 bytes  -92.6%
        Saving  tregsvr.exe              73338 bytes    7.5%
         Total                         -910365 bytes  -92.5%

Оптимизация программ на этапе сборки

В современных версиях Delphi есть возможность оптимизировать программы еще на этапе сборки, тогда обработка при помощи PE Tool не понадобится. Ключ {$SetPEFlags} присутствовал в Delphi еще при Borland, но никакого влияния на сборку программ не оказывал. В Embarcadero Delphi эта оплошность была исправлена, и теперь компоновщик строит программы с учетом заданных флагов. В какой конкретно версии Delphi ключ {$SetPEFlags} стал приниматься во внимание, мне пока неизвестно. Можете подсказать в комментариях, если знаете.
{$IFNDEF DEBUG}
  {$WEAKLINKRTTI ON}
  {$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$ENDIF}

uses
  Windows;

{$IFNDEF DEBUG}
  {$SetPEFlags
    IMAGE_FILE_RELOCS_STRIPPED or
    IMAGE_FILE_DEBUG_STRIPPED or
    IMAGE_FILE_LINE_NUMS_STRIPPED or
    IMAGE_FILE_LOCAL_SYMS_STRIPPED}
{$ENDIF}
Из собранной с такими установками программы PE Tool ничего не выжмет, максимум несколько сот байт с ключом -trunc. С появлением расширенной RTTI Embarcadero Delphi создает больше секций в exe-файле, увеличившийся из-за этого заголовок PE уже не влезает в первые 512 байт, поэтому замена DOS-заглушки не дает выигрыша в размере, — он съедается выравниванием. Секции PE обязательно должны быть выровнены на 512 байт.

Особенности реализации

PE Tool реализована как клиент ExeImages — расширения библиотеки CoreLite, изначально предназначавшегося не только для разбора образов PE, но и как основа для написания патчей. В настоящий момент не все запланированные возможности ExeImages реализованы, и PE Tool остается единственной программой, использующей этот модуль.

См. также

Комментариев нет :

Отправка комментария

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.