Взлом защиты Denuvo

Защита взлом Denuvo

В 2014 году появилась защита от пиратства, которая позже станет одной из самых узнаваемых, — Denuvo. Она пришла на смену SecuROM и связана с одним действующим лицом — Рейнгардом Блауковичем. Пару лет назад я уже писал о том, как я однажды разреверсил SecuROM, разгромив защиту Блауковича в пух и прах. Сегодня я покажу, как проделал то же с Denuvo. Встречайте новую серию «Тибериумного реверсинга»!

Публикуется в память о Крисе Касперски и в поддержку Voksi.

Взлом защиты Denuvo

Да, эту статью можно было написать и раньше, но в жизни много других важных вещей. Работа в лаборатории, перемещения, моя муза и ее красный Ford Focus II за окном. На его капоте мирно таял свежий снег, когда начинался 2019 год. Мне же в голову начали лезть мысли о корпорации Electronic Arts, магазине Origin, игрушках Unravel и Battlefield 4, реализации EA DRM, Denuvo, VMProtect, и… все завертелось.

Если по Steam в Google можно наяндексить все что угодно — от кастомок до эмуляторов, то в связи с клиентом Origin вспоминается разве что динамическая библиотека ItsAMe_Origin.dll, которая вместо оригинала сама сабмитит запросы от клиента. Собственно, 100% пабликовых взломов Origin (3DM, CPY и другие) именно так и работают.

Прямо здесь начинается первый секрет: для взлома Origin вовсе не обязательно копировать систему ответов-запросов «клиент-сервер» (чаще всего это около десяти уникальных ID сообщений)! Потребуется чуть-чуть пореверсить клиент и поближе познакомиться с таким термином, как EA handle (далее — EAH). Но обо всем по порядку.

За рекламирование всякой ерунды, непомерные требования к ресурсам и вытекающую отсюда слоупочность официальный пакет Origin не ругает только ленивый, но мы пойдем дальше и покажем его уязвимую суть. На момент написания статьи вышла версия 10.5.31, а разбирать мы будем клиент 9.10.1.7. Принципиальной разницы между ними нет — EAH и там и там одинаков.

На наше счастье, клиент Origin SDK (который запихивается в саму игрушку) имеет много ошибок — как мелких, так и весьма серьезных. Например, при его работе остаются открытые хендлы объектов, для которых SDK почему-то забывает вызывать функции WinAPI RegCloseKey и CloseHandle. На это можно было бы закрыть глаза, но вот на вызов адреса с нулевым указателем можно смело сабмитить багрепорты.

Думаю, виной тому откровенная запутанность EAH: перегруженность критическими секциями и семафорами, а также фирменная рекурсия указателей на данные. В такой суматохе запросто можно забыть освободить выделенный блок памяти. Благо процедура уничтожения EAH срабатывает при выходе из игрушки (читай — вызове функции TerminateProcess), что, по мнению буржуйских разработчиков, автоматом избавляет их от этой проблемы.

РЕКОМЕНДУЕМ:
Как писать читы для игр

Вот теперь минутка лулзов, леди и джентльмены! Сказ о том, как Denuvo Software Solution навешивала anti-tamper уже на саму Origin SDK. Делали они это весьма неумело, так как не курили мануалов и не представляют, что именно требуется защитить от посягательства пиратов. Всю мякотку я вынес в отдельную часть статьи.

К сожалению, в отличие от SecuROM в код Denuvo Блаукович не вставлял анекдотов. Однако если следовать традиции, то здесь была бы уместна история про ковбоя, который на спор обмочил весь бар, но ни разу не попал в бутылку.

Вот что делает защита Origin SDK:

  • выполняет виртуализацию функции MD5_Update в процедуре отправки запроса;
  • использует константы Origin и игрушки для вставки инструкций cpuid/ret;
  • для отдельных указателей ret (return С++) в процедурах SDK выполняет переход в динамику с дальнейшей обфускацией Denuvo.

Зачем все это? Зачем ей все шелка, цветные облака… зачем?! У нас ведь есть EAH и целая функция инициализации Origin SDK, о которой Denuvo почему-то не знает.

взлом denuvo
Виталий Кличко устроился работать в Electronic Arts

Не отстают от Denuvo Software Solution и наши спортсмены-игроделы. Количество контекстов VMProtect достигло сорока для каноничной второй версии и десяти для третьей. Причем сначала они утрамбовали старую вторую, а сверху повесили третью для защиты целостности второй. Это примерно как если StarForce защищать при помощи SecuROM.

Признаться, в первый раз я несколько прифигел, когда автоматом накрыл все сорок контекстов VMP 2.x за один раз. Однако после проследования станции метро OEP (Original Entry Point), ближе к перегону загрузки kit-файлов игрушки Unravel (Unravel _dump_SCY_dump.exe) тулза Denuvo_Profiler собственной сборки начала сигнализировать о перезаписи патченных хендлов старого импорта каким-то сторонним кодом. For great justice — последние версии Denuvo так и защищали, что вывело новую породу гибридных протекторов.

взлом denuvo
Denuvo_Profiler: именно этими данными формируется Denuvo HWID для вашей машины, плюс расшифровка файла лицензии EA Origin и последующее извлечение секретной таблицы Denuvo

EA DRM, OEP, dump

Первое, с чем придется столкнуться при взломе и отвязке игрушки от Origin, — это EA DRM. Опознать его легко по точке входа, которая катапультирует нас (jmp) в библиотеку Activation.dll или Activation64.dll — смотря какой разрядности винда. Вот как это выглядит у меня:

При наличии купленной игрушки в библиотеке EA DRM снимается не сложнее, чем распаковывается UPX. Вся процедура сводится к тому, что SDK получает AES-ключик для расшифровки контента. Если ключ верный, то дальше SDK сам восстанавливает секции и делает импорт. Дальнейший переход в OEP защищаемой EA игрушки обычно выполняется ближе к концу вызываемой процедуры (в моем примере это call r9 по адресу 000007FEF1687412), либо перед этим вызывается функция GetModuleHandleW.

Здесь сложности могут возникнуть разве что при перехвате управления. Дело в том, что игрушку с определенным каналом ( /SMOID= %хендл от CreateFileMapping%) должен вызывать сам Origin.exe, да еще иногда по нескольку раз. Пока мы будем аттачиться к процессу — пропустим момент выхода на OEP из Activation(64).dll.

Лайфхак прост — сделать подмену библиотеки Activation(64).dll на свою с редиректом вызовов в оригинал. При подхвате управления выводим радостный MessageBox и ожидаем аттача.

EA Origin SDK: Give me the handle and I’ll crack this!

Общая стратегия взлома Origin SDK (который инклудится в игрушку) имеет два разных сценария в зависимости от того, что ты хочешь получить в итоге. Первый вариант сложный, очень палевный и приватный. Он требуется для сетевых игр и обеспечивает возможность играть на официальных серверах. Через цепочку OriginGetDefaultUser() OriginRequestAuthCode ("имя сервера", ex: GOS-BlazeServer-BF4-PC), нужно получить код авторизации, а затем постучать этим AuthCode на сервер. Короче, это тема для отдельной статьи.

Второй вариант гораздо проще. Он пригоден для прохождения одиночных кампаний на локальном компе и никак тебя не запалит в сети. Его мы и рассмотрим подробнее.

Для начала отыщем в коде игрушки процедуру инициализации Origin SDK. Она получает от Origin.exe (в доках он часто называется OriginCore) данные о версии сервера, пользователе и другую подобную инфу, необходимую для дальнейшего запуска игрушки. Если же во время инициализации произойдет ошибка, то процесс попросту завершится, что не входит в наши планы.

Самое главное — эта подпрограмма создает EAH, а всю присланную инфу OriginSDK сливает в эту структуру. Обнаружить код инициализации Origin SDK можно по следующим признакам:

  • использование функции getenv из библиотеки msvcr_xxx.dll (рантайма);
  • появление строк ContentId, EAConnectionId, OriginStartup entered;
  • указание характерных констант ошибок Origin SDK, например 0xa0020008 (ORIGIN_ERROR_CORE_NOT_INSTALLED) или 0xa0010000 (ORIGIN_ERROR_SDK_NOT_INITIALIZED);
  • работа с «карточкой» игрушки. Это такая специальная структура, код которой приводится ниже:

К примеру, в последней на момент написания статьи версии Battlefield 4 (1.8.2.48475) вход в процедуру инициализации Origin SDK выглядел так:

В Unravel он выглядел так:

Во всех случаях бенефициантом является EAH, который при вызове этих процедур воплотится в куче (heap) как структура размером 968 байт ( mov ecx, 0x3C8).

Материализовавшись, EAH послужит тем Солсберийским шпилем, возле которого будет виться остальной OriginSDK. Нельзя пройти мимо сигнатурного обращения к ней — сначала OriginSDK интересуется: «А не ноль ли там?» Если нет, то только тогда тащит оттуда значение:

Адреса EAH:

  • Battlefield 4 (1.8. 2. 48475) — 0000000142789C80
  • Unravel — 0000000141344680

Внимание, фокус! Делаем заглушку на процедуре инициализации EAH ( mov eax, 1 & ret), запускаем и видим, что логи отладчика заспамлены гневными сообщениями: «Origin Error: update fail The Origin SDK was not running». Это как раз происходит из-за того, что теперь EAH равен нулю и перестало выполняться ключевое условие — флаг готовности сетевого соединения в его дочерней структуре WSA_socket не взведен:

Кажется, у нас проблемы? Вовсе нет! Юмор в том, что это отнюдь не препятствие: после тщетных попыток связаться со своими из OriginCore хакнутая игрушка все равно соглашается запуститься. Занавес и выход на бис!

Лайфхаки для дальнейшего ковыряния Denuvo

Ходят слухи, что при взломе Denuvo нужно процессить колбэки EA. Однако мы на них забили, так как у меня OriginSDK ни разу из-за этого не падал.

Иногда после патчинга при запуске игрушки вместо меню появляется черный экран с характерным символом, который «прыгает» или «мигает». В Battlefield 4 таким символом будет мигающее подчеркивание в верхнем правом углу. В Unravel — точка в нижнем правом углу. Это говорит о том, что OriginSDK не может преодолеть языковой барьер.

На скриншоте — сигнатурная языковая проверка в Battlefield 4. Этот «подводный камень» нужно фиксить вместе с патчингом процедуры инициализации EAH. Origin SDK ломается именно таким образом.

защита denuvo

Дело в том, что через EAH, кроме всякого мусора, приходит список языков, на которых игрушка может общаться с геймером: en_US, ru_RU, jp_JP… Для их указания используется глобальный флаг, из-за ошибки инициализации которого в конце процедуры Origin_startup и возникает данное недоразумение. Сигнатурный switch показан на картинке ниже.

Структура Electronic Arts handle (EAH)
Структура Electronic Arts handle (EAH)

Столкнувшись с этой проблемой, попробуй использовать ручной ввод языка игрушки, например через ключ -force_language, указываемый при запуске.
Подведем промежуточный итог: собственно взлом Origin — это блокировка инициализации EAH путем установки заглушки на процедуру Origin_startup. Отсутствие связи с Хьюстоном не преграда для запуска игрушки (в крайнем случае мы просто фиксим языковой барьер). Сам EAH в исследуемых версиях не содержит чувствительных данных, а для проверок флагов используются только условные переходы.

РЕКОМЕНДУЕМ:
Методы защиты от читов

Деобфускация EAH

Выше я писал о «всяком мусоре». Что же такого в EAH напихали заморские разработчики? В ней реализована поддержка вычислений хеш-функции SHA-160, шифрования AES и телеметрии (у версий старше 2015 года). До кучи в EAH выполняется загрузка IGO64.dll из папки \Origin\. Еще там есть EALS (Electronic Arts LSX). Это не самая удачная вложенная аббревиатура, где LSX означает XML Schema Processor Messages. Штука, которая нужна для сверки XML-корреспонденции.

Ее структура получается примерно такой:

Все данные, которые представляют хоть какой-то практический интерес, всегда помещаются в /dev/null конец структуры EAH.

Вся эта «секретная» информация имеет шанс найти применение у вирусописателей. Уверен, они будут счастливы возможности заставить игрушку запускать вредоносный код несколькими путями. Подробнее смотри дальше в описании Denuvo_TLS.

Denuvo + VMProtect = love

Вот и настало время для обещанной истории про то, как Denuvo защищает Origin SDK.

Сигнатурные «руки Блауковича» принимают свои очертания при работе с константами исходного кода игрушки и Origin SDK. Для примера возьмем кусок кода из распакованного unravel_dump_scy.exe (его хеш MD5: 81095fae682c6821f07d9555b0901548).

Этот фрагмент, переваренный декомпилятором Hex-Rays в псевдокод, выглядит так:

Рейнгард Блаукович тоже читает «Тибериумный реверсинг»
Рейнгард Блаукович тоже читает «Тибериумный реверсинг»

Что здесь не так? Обычно первый аргумент — регистр rcx. Он складывается из двух констант: E7FFA20F + 1B005DF1 = 103000000. С учетом того, что все операции выполняются над четырехбайтным регистром, окончательный результат, выданный Hex-Rays, равен 0x3000000. Компилятор на стадии оптимизации повторил бы то же самое. Значит, константа 0x3000000 была намеренно разбита на две части.

Присмотримся ближе к первому операнду слагаемого: B9 0FA2FFE7 mov ecx,E7FFA20F. Почему именно операнд, Холмс? Наверное, под него проще подобрать ассемблерную инструкцию, которую можно скрыть внутри. То есть использовать традиционный прыжок «в середину инструкции» 0FA2… Для проверки этой догадки заменим опкод B9 на 90 «nop — ничего не делать».

CPUID — статическая компиляция для проверки лицензии Denuvo. Естественно, после ее использования нужен jmp rdi для возврата управления. Это «правая рука», а «левая» — системный вызов, которым Origin SDK выделяет память для EAH:

Сигнатурное разделение на два слагаемых для первого аргумента легко выявить в исходном коде (мы же знаем, где все процедуры Origin SDK расположены). Кроме того, нам известно, что вся эта «оранжевая музыка» ломается за пару кликов. Исполнение исходного кода Origin SDK в этом варианте развития событий вовсе не требуется (код будет лежать мертвым грузом). Поэтому ничто не помешает нам перезаписать его хакнутыми инструкциями. Короче, Denuvo свою лицензию проверяет через динамику. Какой смысл вообще в этих статических извращениях?!

Далее идет еще более странное (может, для кого-то даже смешное) поведение австрийских парней. Кусок кода, который отвечает за генерацию открытого ключа для обмена LSX-сообщениями:

Здесь первая процедура sub_14199AB30(&ctx) выполняет нехитрые вычисления:

«Да ведь это же MD5!» — воскликнет наблюдательный читатель и будет абсолютно прав! То есть в читабельном виде код из Hex-Rays выглядит так:

Позвольте, сударь! Где же в приведенных выше примерах «мощная и непробиваемая защита™» Denuvo? А нет ее! При помощи VMProtect 2 накрыты внутренности MD5_Update(&ctx, &randr, 4i64), причем только переходы между основными операциями процедуры. То есть копирование памяти memcpy, раунды — все это открыто!

По сути, в Denuvo «защищается» виртуализацией то, что абсолютно никак не связано с EAH. Например, рандомно генерируемые значения GetTickCount(). К тому же конечный результат всегда можно увидеть после MD5_Final, который никто не трогал.

РЕКОМЕНДУЕМ:
Способы обхода защиты и взлома программ

В истории разработки Denuvo еще была техника «воровства» нескольких ASM-инструкций в выделенную память. Это такой ламерский антидамп, известный еще со времен SafeDisk и первых CD-ROM. Этот детский сад быстро убрали, чтобы не позориться в XXI веке.

Отдельной строкой хотел упомянуть хайп, поднимающийся в Сети, когда очередной блогер выясняет, насколько сильно проседает FPS в игре, защищенной Denuvo. М-да! «А мужики-то и не знают» до сих пор о таких очевидно негативных последствиях бездумного использования виртуальной машины.

Denuvo keygen or not

«Наша защита — это только anti-tamper», — говорили на презентации Denuvo. Разработчики вводили в заблуждение, пускали пыль в глаза… но только не читателям журнала «Хакер». Тайна, покрытая VMProtect, с самого начала не давала никому покоя. Не подвергалось сомнению, что защита использует лицензию для привязки к железу.

Первой ласточкой стало раскрытие критически важных элементов этой привязки. Как оказалось, они не повторяют путь SecuROM, и DES с RSA здесь нет. Перечислим данные, к которым обращается защита на твоей машине. Они уже давно известны и изучены.

  1. Инструкция CPUID. В отличие от применявшейся в других защитах инструкции чтения счетчика циклов — RDTSC (Read Time Stamp Counter), на ней нельзя поставить исключение и тормознуть выполнение потока. Поэтому быстрого решения хакнуть возвращаемые данные в любом месте нет. Ну как нет, в том же «Клубке» (Unravel) она всегда выполняется в динамике и под нее выделено два блока памяти — так что атрибут NO_ACCESS еще никто не отменял.
  2. Трио kernel32.dll, ntdll.dll и kernelbase.dll с их массивом записей IMAGE_DATA_DIRECTORY. При наличии исходников Windows эту привязку (и следующие две, кстати, тоже) очень просто было бы обойти, создав для Denuvo специальную FAKE_IMAGE_DATA_DIRECTORY, а Windows можно было бы оставить на оригинальной.
  3. Структура KUSER_SHARED_DATA по неизменному адресу «Бейкер-стрит, 0x07FFE0000». Это тот самый случай, когда Windows 7 круче «десятки» и «восьмерки» вместе взятых. «Семерка» позволяет спокойно редактировать эту область в ring 3!
  4. Счетчик KSYSTEM_TIME — «The Times», именно с этой дочерней структурой связаны слова Рейнгарда Блауковича о том, что «…вы никогда не узнаете, как работает алгоритм проверки лицензии, так как она всегда меняется при каждом запуске игры». От себя могу добавить, что если в «семерке» поправить содержимое системного счетчика, то он «остановится» и тогда вы точно никогда не узнаете, как он работает, а еще никогда не увидите OEP и никогда не поиграете в свою любимую игрушку, так как Denuvo понимает, что алгоритм в этом случае уже меняться не будет, и впадает в депрессию — бесконечный цикл опроса счетчика KSYSTEM_TIME. Такие дела!
  5. Структура данных «блок среды процесса» (PEB — Process Environment Block). Он же mov rax, gs:[0x60], он же mov eax, fs:[0x30]. Во всех версиях Windows его можно перезаписать. Он наименее чувствителен к изменениям, то есть шанс завалить нормальную работу процесса игрушки при манипуляциях с ним очень мал.

Предлагаю пофантазировать о том, что можно сделать с этими данными. Как думаешь, уважаемый читатель?

Ответ тривиален и полон лулзов: забить все четыре блока нулями и отправить Блауковичу в качестве request code для генерации лицухи. Ты будешь смеяться, но это работает до сих пор! Сервер Denuvo не проверяет очевидную туфту, которую ему подсовывают, и соглашается, что у кого-то количество процессоров равно нулю, а Windows не имеет собственной директории. На фоне всего этого уже не выглядят странно системные библиотеки с пустым массивом IMAGE_DATA_DIRECTORY — без экспорта, без импорта и релоков.

Сервак Denuvo, подобно любвеобильной куртизанке, не откажет никому! Это значит, что в ответ на грубый запрос нам прислали прямо с родины Фрейда лицуху с расширением .dlf. Лицензионное соглашение EA Origin здесь никто не читал, поэтому спокойно распаковываем ее содержимое и видим XML:

Среди всей это белиберды систему Denuvo (и нас) интересуют только два тега:

  1. ContentId — зашитый в игрушке и полученный в лицензии идентификатор контента сверяется простым сравнением строк (strcmp). Выполняется один условный переход.
  2. GameToken — самый интригующий тег. Применительно к Unravel это 214 32-битных целых чисел (DWORDs), которые поксорены константами, разбиты по байтам и имеют привязку к четырем упомянутым выше блокам ( CPUID, PEB, KUSER_SHARED_DATA и IMAGE_DATA_DIRECTORY). Привязка индивидуальна. Вот, собственно, то, что и требуется закейгенить… но не в этой статье.

Пока что полный вперед прежним курсом. Наши координаты по отладчику x64dbg — секция .bss, которая отличается следующим поведением:

Здесь Denuvo_TLS — настоящая находка для вирусописателей: не нужно палиться с функцией CreateRemoteThreadEx. Достаточно использовать WriteProcessMemory, отправив в глобальный стек защиты адрес своего кода, и Denuvo сам подхватит управление. Кстати, он расположен в этой же секции, так что немецкая педантичность не обошла защиту стороной.

Переместим фокус на процедуру Denuvo_LIC_CHECK. Позади — распаковка кода игры и Origin SDK с антиотладочными трюками, впереди — контрольная проверка лицензии, после нее — OEP и триггеры защиты, в которых тоже проверяется лицуха.

Важно то, что до OEP проверка лицензии имеет два фундаментальных отличия от кода защиты, который просто чекает лицуху после проследования станции метро «OEP» где-то на зеленой ветке:

  1. LIC_CHECK расшифровывает и раскидывает секретные DWORD по своим местам для триггеров, срабатывающих после OEP.
  2. Также он выполняет контрольную проверку всей таблицы из 214 двойных слов.

Сейчас будет небольшая сенсация. Начинаем движение и шаг за шагом перемещаемся по процедуре LIC_CHECK в сторону OEP:

  1. Читаем dbdata.dll и проверяем ее водяной знак. С помощью этой либы формируется код запроса, подмена которого уже была показана в исследовании «Тибериумный реверсинг. В погоне за взломом Denuvo» (см. видео по ссылке из блока «WWW»).
  2. Читаем саму лицуху 1031469.dlf по следующему адресу: %ProgramData%\Electronic Arts\EA Services\License\\. Извлекаем ContentId и убеждаемся, что он равен 1031469. Извлекаем GameToken, расшифровываем его, ксорим константами, затем раскидываем таблицу по всей секции в строго отведенные места, которые находятся за возвратом (RET) основных процедур игрушки.
  3. Из сорока контекстов виртуальной машины VMProtect 2 на защиту LIC_CHECK брошен всего лишь один. Он не в состоянии противостоять нашему анализатору, просто контролируется и патчится при первой необходимости. VM_EXIT == 0x1418f3843. Хендл с макросом _READ_DS_DWORD, который (кроме всего прочего) прочтет данные из секретной таблицы, равен 0x141917511.
  4. После того как Denuvo соберет и попутно обработает данные со всех четырех блоков, будет сформирована матрица лицензии, которая с помощью чтения «The Times» каждый раз принимает псевдослучайный вид. Ее можно увидеть в стеке по смещению +0x4A0, если тормознутся на одном из статических cpuid перед общей проверкой.
  5. Решающая проверка. Если секретная таблица корректна — переходим на вызов WinAPI VirtualAlloc и далее OEP. Если нет — после некоторых телодвижений вызовем WinAPI DeleteFileA для несостоявшейся лицухи. Забавный момент: перед тем как удалить лицуху, Denuvo вызывает этот WinAPI с аргументом C:\\, то есть натурально пытается удалить диск C:. Конечно, возвращается ошибка и ничего в итоге не удаляется, но осадочек от такого поворота остается.
  6. Не спеши в OEP, держись за клаву и читай пункт № 7.
  7. Не дыши! Перейди по следующим адресам в отладчике: 0x141A2D850 ( lic_byte_#1) и 0x141445410 ( lic_byte_#2). Обрати внимание на их значения и сверь их с таблицей.

denuvo crack

Теперь можно выдохнуть и постараться перейти на ровное дыхание. Все, что было написано выше, — ключ, которым хакеры открывают алгоритм проверки лицензии Denuvo, накрытый VMProtect!

Таблица значений LIC_BYTE — маленькая сенсация! — это скрытые отладочные байты, которые Denuvo Software Solutiong хранит от посторонних глаз под толстым слоем VMProtect. Вот оно: два байта, которые перевесят все остальные 100 Мбайт распакованного кода Unravel! 214 двойных слов секретной таблицы и два LIC_BYTE можно рассматривать как начало и конец графа.

Даже если эпично наплевать на VMProtect и слова Блауковича «вы никогда не узнаете алгоритм проверки», как минимум можно получить привязку байтов в секретной таблице к четырем блокам HWID ( CPUID, KUSER_SHARED_DATA, IMAGE_DATA_DIRECTORY, PEB).

Если набраться смелости и девиртуализировать всего лишь один контекст VMProtect 2 — небольшой реверс алгоритма, состоящего из примитивных операций ADD/SUB/SHR (на самом деле он сравнительно короткий, а кажущаяся толстота проверки лицензии — всего лишь фейковые операции копирования и проверки), сокрушит «неломаемую™» Denuvo кейгеном.

Подлинная часть исходного кода Denuvo 5.0, полученная от третьей стороны — Gate.h и Gate.cpp. Используется для генерации «псевдовиртуальной машины»
Подлинная часть исходного кода Denuvo 5.0, полученная от третьей стороны — Gate.h и Gate.cpp. Используется для генерации «псевдовиртуальной машины»

РЕКОМЕНДУЕМ:
Взлом игр Unity на примере игры Poker World

2014, 2015, 2016, 2017, 2018, 2019… Спустя столько времени эта статья обрела свою форму на страницах сайта. Мне остается только поблагодарить коллектив этого сайта и следующих завсегдатаев exelab, чья помощь была неоценима: OnLyOnE, Archer, reversecode, Nightshade, mak и все остальные, кого не перечислил. Удачи в вашей борьбе против DRM и до новых встреч на страницах сайта!

Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. blaukovitch

    so classic of reversing

Добавить комментарий