я исследую, возможно ли технически сжимать последовательности повторяющихся инструкций
после ссылки, а не сжимать двоичные файлы как данные.
Идея примерно такова:
1. Выполните статический анализ полностью связанного двоичного файла ELF.
2. Обнаружение часто повторяющихся последовательностей инструкций (например, прологи/эпилоги функций,
общие последовательности ADRP+LDR+ADD в AArch64, блоки обработки ошибок и т. д.).
3. Замените каждое появление такой последовательности однобайтовой недопустимой инструкцией
(выбранной для надежного запуска SIGILL).
4. Встройте небольшой словарь, сопоставляющий эти коды операций с исходными последовательностями инструкций.
5. Во время выполнения установите обработчик SIGILL, который:
- идентифицирует код операции,
- выполняет или эмулирует исходную последовательность инструкций,
- возобновляет выполнение после замененного сайта.
универсальных упаковщиков (UPX и т. д.) тем, что:
- сжимаются только последовательности инструкций,
- не происходит полной двоичной распаковки,
- распаковка осуществляется по требованию во время выполнения.
Мои конкретные вопросы:
• Существует ли архитектурный уровень или уровень ABI причины (Linux ELF, x86_64 / ARM), почему этот подход
будет принципиально небезопасным или ненадежным?
• Используются ли шаблоны расширения/эмуляции инструкций на основе SIGILL в производственных системах
(за пределами эмуляции функций ЦП) и каковы известные подводные камни?
• Будут ли предположения об инструментах (отладчики, загрузчики, размотка, сигналы, W^X и т. д.)
сделают это непрактичным, даже если это технически возможно?
• Существуют ли существующие инструменты или исследовательские проекты, которые уже исследовали эту идею в
контексте после ссылки?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ansion-via
Мобильная версия