EAC под скальпелем: девиртуализация Linux-модуля Easy Anti-Cheat

Инженер Hex-Rays разобрал VM-защиту Linux-сборки EAC и восстановил из байткода компилируемый C. Восстановленный код проверяется регрессионными тестами против исполнения оригинальной виртуальной машины.

Объект исследования — plx.elf, x86-64 ELF со смешанным исполнением: часть кода нативная, часть упакована в собственную VM. Репозиторий содержит полный пайплайн и все артефакты, а не просто дамп.

Инвентаризация VM
Каталогизировано 360 хендлеров и 2107 entry-стабов. Хендлеры классифицируются и символически лифтятся на базе Capstone. Затем каждый стаб трассируется в конкретном и символическом режимах, а трассы группируются в функции. Итог: 107 восстановленных функций.

Границы вызовов
Отдельная задача — найти места, где VM-код передаёт управление нативному. Восстановлено 243 inline-модели, 249 внешних нативных целей и 31 API-импорт. Сгенерированный C собирается в libeac_devirt.so и .dylib.

Сшивка с оригиналом
Сгенерированный код ребейзится на 0x1000000 и дописывается в исходный ELF. Применено 730 релокаций, пропатчено 1411 переходов, импорты привязаны к оригинальному PLT. В IDA 9.5 открываешь plx_devirt_paths.i64 и переходишь между devirt_sub_* и оригинальными sub_* по xref.

Что нашлось внутри
• sub_44D10 оказалась RC4 key scheduling. Старая трасса специализировала цикл инициализации на первой итерации и «протекала» конкретным регистровым sentinel. Новая модель совпадает с VM на 13 длинах ключа.
• Чтение FS:[0x28] (stack canary) опущено до нативных FS/GS-загрузок.
• Деление через __divti3 заменено на divl/idivl/idivq с сохранением поведения #DE.
• Расшифровано 189 строковых адресов в .rodata, из них 167 уникальных текстов.

Верификация
Главная ценность проекта — дисциплина проверок. Набор из 21 регрессионного теста включает 128 сравнений continuation-ов на -O0 и -O2 с эмуляцией оригинальной VM в Unicorn. На 64 комбинациях входов сверяются 15 GPR, флаги CF/PF/ZF/SF/OF и 512 байт гостевого стека. Бюджет восстановления поднят с 200 до 1024 хендлеров, а вложенные символические ветки возвращаются в CFG-worklist. Все артефакты привязаны к SHA-256.

Ограничения
Остаётся внешняя зависимость vm_read_xmm: 40 мест сохранения XMM6–XMM15 в четырёх функциях. В выводе Hex-Rays ещё есть дефекты реконструкции циклов. Найдено 10 пропущенных VM-входов. Эквивалентность всей программы автор прямо называет непроверенной.

Любопытная деталь: лифтинг, трассировку и аудит автор выполнял с помощью LLM через Hex-Rays IDA Assist. Репозиторий опубликован "исключительно" для изучения VM-защит.

Repo: github.com/19h/eac-linux-devirt

@poxek | @poxek_ai | MAX
Просмотры: 162
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти