Взлом Denuvo через гипервизор
Взлом Denuvo с помощью гипервизора — это высшая, трансцендентная форма цифрового некромантства, изощрённейший способ полового сношения с проприетарным кодом в особо извращённой форме и, по совместительству, Святой Грааль для тех, кто считает, что отдавать 70 вечнозелёных президентов за недоделанный кусок бета-теста — это моветон, а DRM — это раковая опухоль на теле игровой индустрии, которую нужно выжигать напалмом, радиацией и тяжёлым ассемблером. Суть метода, если отбросить лишний пафос (хотя куда же без него на Лурке), заключается в том, чтобы запихнуть защищённую игру (и саму Denuvo, естественно) в виртуальную песочницу, о которой она даже не подозревает, и там, на уровне, недоступном для понимания простого смертного приложения (Ring 3), ласково и нежно перехватывать все её истеричные запросы к центральному процессору, подменяя суровую реальность на сладкую ложь. Это не просто кряк, это, сука, «Матрица» для экзешника, где Нео — это потный хакер-красноглазик, Морфеус — это драйвер гипервизора, а Агент Смит — это австрийский говнокод защиты, который безнадёжно пытается понять, почему его наносекундные тайминги не совпадают с тактовой частотой Вселенной, а серийный номер процессора меняется при каждом перезапуске, как настроение у беременной школьницы.
Зачем козе баян?[править]
Чтобы осознать всё величие и одновременно феерический идиотизм ситуации, нужно вернуться к истокам и понять, почему вообще возникла необходимость лезть в такие дебри, где волки срать боятся, а BSoD — это самый безобидный исход эксперимента. Denuvo Anti-Tamper — это та самая дрянь, из-за которой твой новенький i9, купленный в кредит на пять лет, начинает захлёбываться в конвульсиях при запуске очередного Assassin’s Creed, а SSD-диск молит о пощаде, стирая свои ячейки памяти быстрее, чем ты успеваешь сохраняться. Разработчики этой защиты, сидя в своём уютном офисе в Зальцбурге (пока их не купила Irdeto, решившая, что одной системы условного доступа для зомбоящика им мало, и нужно поработить ещё и пека-бояр), придумали «гениальную», как им казалось, схему: обфусцировать код так, чтобы даже сам процессор с трудом понимал, что от него хотят, и напихать туда триггеров, проверяющих целостность кода, время выполнения инструкций, наличие отладчиков, фазу Луны в Козероге и цвет трусов пользователя.
Обычный взлом через отладчик (debugger) типа x64dbg или старая добрая OllyDbg (мир её праху) тут не прокатывает по одной простой причине: Denuvo палит попытки приаттачиться к процессу быстрее, чем школьник сворачивает порно при входе мамки в комнату. Как только защита чует неладное (а чует она всё, включая изменение пары байт в памяти или наличие запущенного Cheat Engine), она либо крашит игру к чертям собачьим, либо превращает геймплей в слайд-шоу с 5 FPS, либо отправляет тебя в бесконечный цикл загрузки, прозрачно намекая, что пора бы и честь знать, и вообще, иди купи лицензию, нищеброд. Более того, эта зараза использует виртуализацию собственного кода (да-да, виртуальная машина внутри игры, Карл!), превращая простые и понятные инструкции вроде MOV EAX, EBX в адское месиво из сотен бессмысленных операций, размазанных по оперативной памяти ровным слоем маргарина. Читать такой код глазами — прямой путь в дурку, дебажить его — прямой путь к алкоголизму.
И тут на сцену выходят гипервизоры. В нормальном мире их используют бородатые сисадмины для серверной виртуализации, чтобы на одном жирном сервере крутить стопицот линуксов, майнить крипту втихаря от начальства и экономить электричество. Но в мире реверс-инжиниринга гипервизор — это путь в Ring −1 (минус первое кольцо защиты). Если ты, анон, прогуливал информатику в школе и вместо уроков курил за гаражами, то поясню на пальцах: операционная система (Windows) работает в Ring 0 (режим ядра), приложения и игры — в Ring 3 (пользовательский режим). Denuvo сидит где-то между ними, раскорячившись драйвером и юзермодным кодом, пытаясь контролировать всё и вся, словно вахтёрша в общежитии. А гипервизор — это Бог, который сидит ПОД операционной системой. Он использует аппаратную виртуализацию (Intel VT-x или AMD-V) и контролирует само железо. Запуская игру под специально написанным, кастомным гипервизором, ты становишься Архитектором реальности. Denuvo спрашивает у процессора: Эй, процессор, а какой у нас серийник? А сколько сейчас тактов прошло с момента последней проверки целостности? А не подменил ли кто-то мне байт по адресу 0xDEADBEEF? А гипервизор перехватывает этот вопрос (событие VMExit), смотрит на него, усмехается, подменяет ответ на Всё чисто, братишка, мы на лицензионном железе, код оригинальный, мамой клянусь и возвращает управление игре (VMEntry). И защита верит. Она не может не верить, потому что для неё гипервизор невидим, как совесть у депутата… в теории.
Техническая драма[править]
Реализация этого метода требует скиллов уровня Godlike, граничащих с аутизмом. Это тебе не замену steam_api64.dll сделать и не hex-редактором байтики поменять по инструкции с YouTube от индуса с ужасным микрофоном. Тут нужно знать архитектуру процессоров Intel/AMD лучше, чем инженеры, которые их проектировали (а они, судя по количеству уязвимостей типа Spectre и Meltdown, сами ни хрена не знают). Основная идея крутится вокруг перехвата критически важных инструкций без модификации самого кода игры в памяти (ибо Denuvo проверяет контрольные суммы блоков кода, и любой, даже самый маленький патч в памяти = триггер = game over).
EPT Hooking[править]
Основа основ — это EPT (Extended Page Tables), механизм, позволяющий виртуализировать физическую память. Представь, анон, что игра хочет прочитать кусок памяти по адресу X. В нормальной ситуации она читает то, что там лежит. Но с помощью EPT-хуков злой хакер может настроить таблицы страниц так, что для игры по адресу X будет лежать оригинальный, чистый код, который проходит все проверки целостности (Integrity Checks), а при попытке исполнения (Execution) кода с этого же адреса процессор будет перенаправлен на совершенно другую физическую страницу, где лежит наш грязный, патченый шеллкод или трамплин в гипервизор. Это называется Split TLB или RWX separation (Read/Write/Execute separation).
Сценарий выглядит примерно так:
- Denuvo: А ну-ка, прочитаю я свои байты по адресу N, не изменил ли их грязный пират?
- Гипервизор: На, читай оригинал, всё по ГОСТу. (Подсовывает страницу с правами Read-Only, содержащую нетронутый код).
- Denuvo: Ок, всё чисто, хэш совпадает. Теперь исполняем эту инструкцию!
- Гипервизор: Хрен тебе лысый! (При попытке Execute срабатывает EPT Violation или переключение на страницу с правами Execute-Only, где лежит кряк).
Это позволяет обходить проверки целостности так изящно, что защита даже не понимает, что её имеют во все порты. Но не всё так радужно, как в мечтах мамкиных хакеров.
RDTSC[править]
Главный, сука, враг гипервизора — это время. Переход из режима гостя (игры) в режим гипервизора (Root mode) и обратно занимает время. Много времени по меркам процессора. Тысячи, мать их, тактов. Denuvo, будучи тварью подозрительной, обожает использовать инструкцию RDTSC (Read Time-Stamp Counter) для замеров времени выполнения кусков кода. Она делает замер в начале блока, выполняет код, делает замер в конце.
Логика проста как пробка:
Если (Время_Конца - Время_Начала) > Ожидаемого_Времени, значит, кто-то перехватывал исполнение. Значит, процессор отвлекался. Значит, мы в виртуалке. Значит, DENIED.
Гипервизор может перехватить и саму инструкцию RDTSC, чтобы подделать возвращаемое значение (вычесть из него время, потраченное на обработку хука). Но сам перехват RDTSC тоже вызывает VMExit, что создаёт рекурсивную проблему: чтобы скрыть задержку, мы создаём ещё большую задержку, пытаясь её скрыть. Это замкнутый круг страданий, из которого выбираются только гении оптимизации или те, кто нашёл дыру в логике замеров самой Denuvo. Хакеры называют это Timing Attacks, а простые юзеры называют это почему игра фризит каждые пять секунд?!
Главная проблема гипервизоров не в том, чтобы их написать, а в том, чтобы сделать их невидимыми. Denuvo тоже не лаптем щи хлебает и давно научилась детектить, что она запущена в виртуалке. Это бесконечная гонка вооружений: снаряд против брони, хакер против корпорации, здравый смысл против жадности.
Кроме того, существуют атаки по сторонним каналам (Side-channel attack). Например, кэш процессора. Вход в гипервизор может «вымывать» кэш L1/L2, и Denuvo может заметить, что доступ к памяти стал подозрительно медленным сразу после выполнения определённой инструкции. И тут начинается настоящая паранойя.
CPUID и спуфинг HWID[править]
Одна из главных фич Denuvo — привязка к «железу» (HWID). Лицензионный токен генерируется на основе уникальных характеристик твоего ПК (модель CPU, серийники дисков, MAC-адрес сетевухи). Если ты скачал токен друга (или токен с торрента), он у тебя не заработает, потому что железо другое. Denuvo скажет: Ты кто такой? Давай, до свидания!.
Гипервизор позволяет перехватывать инструкцию CPUID и возвращать фейковые значения. Ты можешь заставить игру думать, что у тебя стоит процессор Pentium 4, а зовут тебя Вася Пупкин, и этот Вася именно тот, на кого выписан валидный токен. Именно этот метод использовала легендарная (или поехавшая, тут как посмотреть) группа MKDEV в своих последних работах перед уходом на покой. Они создали своего рода «универсальное» решение, которое подменяло данные CPU на те, под которые был сгенерирован один-единственный валидный токен. Проблема в том, что токенов нужно много, они тухнут, а Denuvo банит их пачками.
История болезни: MKDEV, Voksi и другие герои[править]
Взлом через гипервизор — это не ноу-хау вчерашнего дня. Слухи о «Blue Pill» для игр ходили ещё со времён StarForce, который тоже любил ставить раком систему своими драйверами, от которых CD-ROMы переставали читать диски, а винда падала в синьку при виде записанной болванки. Но реально применять это начали, когда Denuvo стала совсем уж невменяемой, и обычные методы перестали работать.
Болгарский вундеркинд Voksi (до того как к нему постучали дяди в погонах по наводке Irdeto и изъяли все компы, оставив парня с голой жопой и судебным иском) баловался обходами, но он больше специализировался на дырах в Steam (demo bypass). А вот MKDEV — это отдельная песня. Эти ребята годами долбились в стену, выпуская кряки, которые работали только по праздникам, только на определённых билдах Windows и только если звёзды сойдутся в правильной конфигурации. В народе их кряки называли «менюшными», потому что они часто шли с собственным GUI, где нужно было выбирать параметры, крутить ползунки и молиться Ктулху.
В 2023 году, когда надежды уже не было, MKDEV внезапно релизнули кряк для FIFA 23 (а позже и Football Manager), который базировался именно на гипервизоре. Это был шок. Игра запускалась, создавала виртуальную среду, дурила Denuvo и работала. Правда, не у всех. И не всегда. И часто с BSOD (синим экраном смерти), потому что драйвер гипервизора конфликтовал с античитом EA, с защитником Windows, с драйверами мышки, с RGB-подсветкой клавиатуры и с магнитными бурями на Солнце.
Но сам факт! Они доказали, что можно не ломать логику защиты (что делает безумная EMPRESS), а просто обмануть её восприятие реальности. К сожалению, MKDEV объявили о завершении карьеры сразу после этого, оставив исходники своего «инструмента» в полуприватном доступе, откуда они расползлись по GitHub и форумам вроде exelab и cs.rin.ru. Теперь любой студент может скачать их код, скомпилировать, получить BSOD и пойти плакать на форумы.
Почему это не стало мейнстримом?[править]
Казалось бы, вот она — победа! Универсальный метод! Берём один валидный токен, пишем гипервизор, который подсовывает этот токен всем желающим, и Denuvo сосёт бибу причмокивая. Почему же каждый второй репак на торрентах не идёт в комплекте с кастомным гипервизором? Почему FitGirl не пакует игры с этим чудо-средством?
А вот тут, мой юный любитель халявы, мы упираемся в суровую реальность и подводные камни, размером с айсберг, утопивший Титаник, и ещё пару соседних кораблей.
- Сложность установки для хомячков. Чтобы запустить такой кряк, юзер должен совершить ритуал:
- Отключить Secure Boot в BIOS (потому что гипервизор — это драйвер ядра, а Windows 10/11 не даёт грузить неподписанные драйверы просто так, считая их руткитами — и правильно делает, кстати).
- Включить Test Mode в винде (надпись в углу экрана «Тестовый режим» будет бесить перфекционистов).
- Возможно, отключить Hyper-V (который используется для Docker, WSL2, песочниц и эмуляторов Android), потому что два гипервизора на одном ядре дерутся как пауки в банке (хотя технология Nested Virtualization существует, но она тормозит всё ещё сильнее и глючит как сволочь).
- Объяснить Васе из 7 «Б», как зайти в BIOS, найти там Secure Boot, отключить его и не окирпичить мамин ноутбук — задача невыполнимая. Вася скорее скачает вирус, который зашифрует его порноколлекцию, чем настроит гипервизор.
- Нестабильность. Драйверы уровня ядра — это вам не шутки на JavaScript. Ошибка в одной строчке кода в Ring 3 приведёт к вылету игры на рабочий стол с ошибкой. Ошибка в Ring −1 приведёт к мгновенному краху всей системы (KERNEL_SECURITY_CHECK_FAILURE, SYSTEM_SERVICE_EXCEPTION и прочие радости). Релиз-группы типа CODEX (земля им пухом, легенды) или CPY ценили качество и стабильность. Им не нужен был репак, который работает у 30 % пользователей, а у остальных вызывает желание выйти в окно вместе с системным блоком.
- Античиты. Если в игре есть онлайн (или даже если его нет, но есть античит типа BattlEye или Easy Anti-Cheat, прикрученный для галочки, чтобы жизнь мёдом не казалась), гипервизор будет обнаружен мгновенно. Античиты тоже живут в ядре, тоже параноики и тоже умеют сканировать память и проверять наличие виртуализации. Увидев левый гипервизор, BattlEye просто не даст запустить игру, а то и перманентный бан выпишет по железу. Получается парадокс: чтобы взломать защиту от пиратства, нужно обойти защиту от читов, которая охраняет защиту от пиратства. Йоба, какой рекурсивный ад!
- Производительность. Хотя современные процессоры умеют в виртуализацию очень быстро (Intel VT-x/EPT работают аппаратно), накладные расходы всё равно есть. Каждый перехват инструкции (VMExit/VMEntry) стоит тысячи тактов. Если Denuvo делает проверки тысячу раз в секунду (а она делает, и даже чаще), игра начинает фризить, дёргаться и лагать. Если к этому добавить кривой код самого хакера, написанный левой пяткой под пивас, то стабильные 60 FPS превращаются в кинематографичные 24, а то и 15, вызывая рвотные позывы у геймера.
EMPRESS и её особое мнение[править]
Нельзя говорить о взломе Denuvo и не упомянуть EMPRESS — Королеву Драмы, Шизофрении, КАПСЛОКА и Ассемблера. Пока остальные ковырялись с гипервизорами и пытались обойти защиту «с тыла», она (или он, или группа безумных гениев, или нейросеть, обученная на форумах 4chan) продолжала ломать защиту «старым дедовским» методом: статическим анализом, деобфускацией и жестким патчингом кода.
В своих философских трактатах (NFO-файлах), которые по объёму текста скоро перегонят «Войну и Мир», Императрица неоднократно поливала грязью попытки использовать эмуляторы и гипервизоры, называя это «костылями для слабаков», «мусором для недоумков» и прочими нелестными эпитетами. Её метод — полное удаление раковой опухоли из кода, вырезание всех проверок под корень, восстановление оригинальных инструкций. Это «чистый» взлом. Гипервизор же — это попытка обмануть опухоль, заставив её думать, что она здорова, пока пациент медленно умирает.
С технической точки зрения, подход EMPRESS более правильный (игра работает нативно, без оверхеда, как и задумывали разработчики до того, как маркетологи заставили их впихнуть Denuvo), но он требует нечеловеческих усилий, огромного количества времени и скилла, который есть у полутора землекопов на всей планете. Гипервизор же теоретически масштабируем (написал один раз движок — применяй ко всем играм), но на практике — слишком геморроен для конечного пользователя и слишком палевен для античитов.
DENUVO IS CANCER. HYPERVISORS ARE TRASH. I AM GOD. — примерно так можно резюмировать позицию Императрицы, если убрать из её текстов тонны мата и ненависти к человечеству.
Мы все умрём[править]
Пока Denuvo продолжает насиловать наши SSD и процессоры, отжирая драгоценные такты на проверку того, не украл ли ты игру, хакеры будут искать пути обхода. Гипервизоры остаются мощным инструментом в руках исследователей (researchers), которые хотят понять, как именно эта австрийская поделка работает, чтобы потом, на основе полученных знаний, написать обычный, православный кряк, не требующий танцев с бубном.
Однако, с развитием технологий виртуализации (Microsoft активно толкает VBS — Virtualization-based Security в Windows 11, засовывая само ядро винды в виртуалку), грань между хостом и гостем стирается. Возможно, в будущем все мы будем жить в гипервизоре, и взлом игр превратится в написание плагинов для ядра Windows или в поиск 0-day уязвимостей в самом процессоре.