С этого момента большинство разработчиков собирает программы с поддержкой ASLR, что приводит к добавлению секции перемещаемых символов в exe-файлы. Когда-то давно такое поведение компоновщиков считалось за недостаток, но появление ASLR поменяло правила игры. Предполагается, что ASLR затруднит работу некоторых вирусов, но так ли это на самом деле, сказать трудно.
Перемещаемые символы
Перемещаемые символы занимают 5-15% от общего размера exe-файла. Если вы не озабочены проникновением вирусов или хотите эксплуатировать современные программы на старых ОС, можно сэкономить. Windows XP не имеет поддержки ASLR и потому никак не использует перемещаемые символы, так что в программах для нее они лишь тратят место впустую.Заметьте, что удаление перемещаемых символов — не сжатие программы, оно не мешает работе страничной адресации и не дает накладных расходов, а на системах с ASLR невозможность перемещения программы даже сделает ее загрузку чуточку быстрее, вот только микросекундную разницу вы вряд ли заметите.
PE Tool и сторонние утилиты strip
В дистрибутиве PE Tool есть пакетный файлstip.bat
, в котором прописаны ключи, необходимые для оптимизации. Имя strip
может конфликтовать с одноименными утилитами в составе некоторых компиляторов. Если же у вас таких нет, смело помещайте pet.exe
и strip.bat
в каталог, доступный через переменную среды path
, либо добавляйте в path
каталог с распакованной PE Tool.Использование PE Tool
Проводить свои эксперименты мы будем на дистрибутиве Far Manager 3-й ветки — ночной сборке, актуальной на момент написания статьи. Судя по новостям с форума Far, он по-прежнему работоспособен на XP, а если что-то ломается, после жалоб пользователей совместимость быстро восстанавливают. Если вы используете Far Manager на XP, информация ниже имеет для вас прикладной смысл.Что вырежется?
Если не передавать ключ-into
, по умолчанию программа прикидывает, что можно удалить из файлов:
T:\Far>strip *.exe *.dll /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Estimating Far.exe -197734 bytes -5.0% Estimating lpeg.dll Chained data found, safe stripping stopped Estimating lua5.1.dll -772 bytes -8.4% Estimating lua51.dll Chained data found, safe stripping stopped Estimating luafar3.dll -254 bytes -0.1% 5 files, -198760 bytes (-4.2%)В дистрибутиве Far некоторые библиотеки собраны компоновщиком GNU, нарушающим стандарт. Обрезать их нельзя, о чем выводится предупреждение. Если хочется поэкспериментировать, ключ
-unsafe
позволит обрезать любой файл на свой страх и риск.Сохранение результатов
Чтобы сохранить измененные файлы, нужно указать ключ-into
. В качестве аргумента ему передается имя файла или каталога. При обработке нескольких файлов сохранение возможно только в каталог.Если указать ключ
-into
без аргументов, программа перепишет исходные файлы:
T:\Far>strip *.exe *.dll -into /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Stripping Far.exe -197734 bytes -5.0% Stripping lpeg.dll Chained data found, safe stripping stopped Stripping lua5.1.dll -772 bytes -8.4% Stripping lua51.dll Chained data found, safe stripping stopped Stripping luafar3.dll -254 bytes -0.1% 5 files, -198760 bytes (-4.2%)По сравнению с предыдущим примером действие Estimating поменялось Stripping, и обработанные файлы заменились. Запускаем Far и убеждаемся в его работоспособности после операции.
Краткая и подробная статистика
PE Tool умеет выводить краткую или подробную статистику обработки файлов. По умолчанию при обработке одного файла протоколируются все действия, а при обработке нескольких — только итоги.Вывод действий для одного файла выглядит так:
T:\Far>strip lpeg.dll -unsafe /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Loading lpeg.dll 33792 bytes 100.0% Image data 35328 bytes 104.5% Chained data -14 bytes -0.0% Replacing stub C:\Tools\Pet.exe -1472 bytes -95.8% Stripping -2952 bytes -8.4% Total -1430 bytes -4.2%Ключ
-log actions
включает подробный вывод при обработке нескольких файлов.Включение ASLR в программах, собранных компиляторами Borland
Если вы до сих пор пишете на Delphi версий от 2 до 2006, этот раздел для вас. Как упоминалось ранее, компиляторы Borland Delphi и C++ Builder всегда включали перемещаемые символы в exe-файлы, и до появления ASLR это считалось их недостатком. Сейчас же с их программами сложилась парадоксальная ситуация: перемещаемые символы в образе есть, но флаг ASLR не установлен, в результате чего и место расходуется, и ASLR не работает.PE Tool может устранить этот недостаток, причем в любую сторону:
- Вырезать перемещаемые символы, уменьшив размер программы.
- Сохранить перемещаемые символы и включить ASLR.
T:\Far>strip -aslr -into Far.exe /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Loading Far.exe 3895914 bytes 100.0% Image data 3896320 bytes 100.0% Replacing stub C:\Tools\Pet.exe 0 bytes 0.0% Stripping -406 bytes -0.0% Keeping relocations 131730 bytes 3.4% Saving Far.exe 3895914 bytes 100.0% Total 0 bytes 0.0%Обратите внимание, что ASLR можно включить только для тех программ, перемещаемые символы из которых не были вырезаны ранее, иначе будет выдано сообщение об ошибке:
T:\Far>strip -aslr -into Far.exe /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Loading Far.exe 3764122 bytes 100.0% Image data 3764224 bytes 100.0% Replacing stub C:\Tools\Pet.exe 0 bytes 0.0% Stripping -102 bytes -0.0% Dynamic image base feature (ASLR) is not available because relocations were stripped from this file: Far.exe
Установка требуемой версии Windows
В заголовке exe-файла есть поле, в котором хранится версия Windows, нужная для запуска этой программы. При запуске программы из-под Windows ранней версии будет выдано сообщение об ошибке.После прекращения поддержки Windows XP всё большее число программ собирается с версией 6.0 в заголовке, требуя минимум Windows Vista. Поскольку проверка версии технически отделена от привязки к новым функциям, в теории возможна ситуация, когда программа требует новую версию ОС просто так.
Ключом
-osver
можно прописать любую версию ОС в заголовок:
T:\Far>strip -into Far.exe -osver 4Если понизить версию в программе, действительно использующей новые функции, при ее запуске будет выдана ошибка об отсутствии функции в одной из системных библиотек, чаще всего это
kernel32.dll
или user32.dll
:Точка входа в процедуру SetFilePointerEx не найдена в библиотеке DLL KERNEL32.dll.Версию
-osver
можно задавать одним числом или двумя, через точку. Если второе число опущено, берется значение 0.Таблица соответствия версий ядра Windows
- Windows 95, Windows NT 4 — 4.0.
- Windows 98 — 4.10.
- Windows ME — 4.99.
- Windows 2000 — 5.0.
- Windows XP — 5.1.
- Windows Server 2003, Windows XP x64 — 5.2.
- Windows Vista, Windows Server 2008 — 6.0.
- Windows 7, Windows Server 2008 R2 — 6.1.
- Windows 8, Windows Server 2012 — 6.2.
- Windows 8.1, Windows Server 2012 R2 — 6.3.
- Windows 10 — 10.0.
Пользовательские заглушки
В дистрибутиве PE Tool есть каталогCustomStubs
, где файлы с пользовательскими DOS-заглушками имеют номера версий Windows в названиях. Если вы меняете версию в заголовке, при помощи ключа -stub
можно подменить заглушку, чтобы при запуске из-под DOS программа выдала сообщение, какая именно версия Windows ей требуется.Учтите, что заглушки размером более 60 байт добавляют минимум 512 байт к программе — секции exe-файлов должны быть выровнены на границу 512 байт, меньше нельзя:
T:\Far>strip -into Far.exe -stub T:\Pet\CustomStubs\Win5.exe /\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright © 2013-2017 Vladislav Javadov (_____)_m_m) Loading Far.exe 3764122 bytes 100.0% Image data 3764224 bytes 100.0% Replacing stub CustomStubs\Win5.exe 448 bytes 700.0% Stripping -102 bytes -0.0% Saving Far.exe 3764634 bytes 100.0% Total 512 bytes 0.0%На момент написания статьи PE Tool выводит приращение размеров без знака, отчего не сразу удается понять, что размер файла увеличился, а не уменьшился. В будущих версиях эта недоработка будет устранена — прирост размера будет выводиться с плюсом в начале.
Unicode в окне консоли
PE Tool использует Unicode для внутреннего представления строк, что позволяет обрабатывать файлы с любыми символами в именах, поддерживаемыми Windows: кириллицей, латиницей с диакритикой, каной, иероглифами и пр. Для корректного отображения всех символов окну консоли должен быть назначен шрифт TrueType или OpenType, чаще всего это Lucida Console или Consolas.Если консоль использует растровый шрифт, некоторые символы будут отображаться с искажениями. Это может доставить неудобство, но на работоспособность PE Tool или содержимое изменяемых файлов никак не повлияет.
Искажение выводимых символов легко определить по значку авторских прав в шапке программы. Если всё в порядке, он имеет вид ©, иначе на его месте будут присутствовать два искаженных символа (в примере ниже один из символов не виден, поскольку это неразрывный пробел U+00A0):
/\_/\ .__/ o o \ PE Tool 0.6 revision 767 /~__;==t==/ Copyright ┌ 2013-2017 Vladislav Javadov (_____)_m_m)
PE Tool и старые ОС
PE Tool использует Unicode-версии системных функций и консоль с поддержкой UTF-8, из-за чего требует ядро типа NT и системные функции Windows 2000, — в заголовкеpet.exe
прописана версия 5.0. На версиях младше Windows 2000 PE Tool можно запустить только при помощи KernelEx.Для экспериментов с программами под старые ОС лучше брать PE Tool 0.6 или выше, поскольку именно в 6-й ветке были улучшены диагностические сообщения о неподдерживаемых форматах файлов.
На момент написания статьи выпущена только альфа PE Tool 0.6, но она рассматривается как альфа лишь с точки зрения развития программы: изменений по сравнению с версией 0.5.1 пока мало, а версию 0.5.2 решено не выпускать, поскольку 5-я ветка закрыта.
Удачных экспериментов!
Комментариев нет :
Отправить комментарий
Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.
Примечание. Отправлять комментарии могут только участники этого блога.