EAC под скальпелем: девиртуализация Linux-модуля Easy Anti-Cheat
Инженер Hex-Rays разобрал VM-защиту Linux-сборки EAC и восстановил из байткода компилируемый C. Восстановленный код проверяется регрессионными тестами против исполнения оригинальной виртуальной машины.
Объект исследования —
Инвентаризация VM
Каталогизировано 360 хендлеров и 2107 entry-стабов. Хендлеры классифицируются и символически лифтятся на базе Capstone. Затем каждый стаб трассируется в конкретном и символическом режимах, а трассы группируются в функции. Итог: 107 восстановленных функций.
Границы вызовов
Отдельная задача — найти места, где VM-код передаёт управление нативному. Восстановлено 243 inline-модели, 249 внешних нативных целей и 31 API-импорт. Сгенерированный C собирается в
Сшивка с оригиналом
Сгенерированный код ребейзится на
Что нашлось внутри
•
• Чтение
• Деление через
• Расшифровано 189 строковых адресов в
Верификация
Главная ценность проекта — дисциплина проверок. Набор из 21 регрессионного теста включает 128 сравнений continuation-ов на
Ограничения
Остаётся внешняя зависимость
Любопытная деталь: лифтинг, трассировку и аудит автор выполнял с помощью LLM через Hex-Rays IDA Assist. Репозиторий опубликован "исключительно" для изучения VM-защит.
Repo: github.com/19h/eac-linux-devirt
@poxek | @poxek_ai | MAX
Инженер 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