Идея:
- Выполнить статический анализ полностью связанного двоичного файла ELF для обнаружения часто повторяющихся последовательностей инструкций (например, прологов/эпилогов функций, общих шаблонов доступа к памяти).
- Заменить каждое вхождение такой последовательности однобайтовой недопустимой инструкцией (выбранной для надежно запускать SIGILL).
- Встройте небольшой словарь, сопоставляющий эти коды операций с исходными последовательностями инструкций.
- Во время выполнения установите обработчик SIGILL, который идентифицирует код операции, выполняет или эмулирует исходную последовательность инструкций и возобновляет выполнение.
- Сжимаются только последовательности инструкций.
- Полная двоичная распаковка не требуется.
- Распаковка происходит по требованию во время выполнения.
Существуют ли ограничения на уровне ядра архитектуры, ABI или Linux (например, сигналы, память W^X, обработка исключений, таблицы очистки), которые сделали бы этот подход на основе SIGILL принципиально небезопасным или ненадежным на x86_64 двоичных файлах Linux ELF?
Я не спрашиваю об общих инструментах сжатия, эмуляции ЦП или поддержке нескольких архитектур — меня конкретно интересует жизнеспособность и безопасность этого метода расширения SIGILL после соединения.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ical-on-x8
Мобильная версия