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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Защита в разрезе

Начнем с азов. Denuvo – современная система защиты лицензионного софта, в частности игр, от взлома. Тем самым система предотвращает распространение пиратских копий и торрент версий игр. По крайней мере, так было до недавнего времени, пока Denuvo не научились взламывать все кому не лень.


Официально, то, как работает Denuvo покрыто тайной. В том плане, что никакой официальной информации нет, а та, что есть, никем не подтверждается. Но совершенно очевидно, что система использует крипто-шифрование. Т.е. сложный алгоритм шифрования данных. Поэтому их достаточно сложно раскодировать, но не невозможно. В современном мире, криптозащиту используют банки и большие кампании для отправки зашифрованных сообщений и данных по операциям. Обычно такие данные имеют определенную срочность и актуальность, поэтому их, как правило, никто не пытается взломать. Вот кому сегодня может понадобиться информация о технических данных Xbox One X? А ведь файл с такими данными могли взломать только сейчас.

Да будет взлом

Прежде чем понять, как работает Denuvo, нужно понять, как в принципе происходит взлом игр. Перед запуском основного приложения, игра делает простенькую самопроверку и устанавливает связь с сервисом, к которому она привязана (Steam, Uplay, Origin), откуда ей приходит «добро» на запуск. Пираты как раз и отключают этот механизм проверки, чтобы игра сразу начала запуск. Как правило, данный алгоритм встроен прямо в основной файл запуска игры, в народе называемый «ехе-шник».


Работы Denuvo заключается в том, чтобы этот файл и другие смежные с ним файлы зашифровать, чтобы хакеры и пиратские группировки не могли получить доступ к процедуре проверки и не могли ее отменить.

После запуска приложения система защиты дешифрует файлы и сразу отправляет их в оперативную память, по возврату из которой файлы шифруются обратно. Т.е. да, есть проблема того, что Denuvo регулярно перезаписывает данные на жестком диске. Но делает она это не настолько часто, чтобы создавать панику по поводу слишком быстрого сокращения срока службы. Частота скорее зависит от того, как часто вы запускаете игру и как часто меняете карты, режимы и т.д.

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<LSX>

<Response id=»3″sender=»EbisuSDK»>

<GetProfileResponse AvatarId=»%LOCALAPPDATA%\Origin\AvatarsCache\многоцифрбукв.jpg#26813913″CommerceCountry=»RU»

IsTrialSubscriber=»false»

SubscriberLevel=»0″

Persona=»XAKEP.RU»

IsUnderAge=»false»

CommerceCurrency=»RUB»

Country=»RU»

UserIndex=»0″

IsSubscriber=»false»

GeoCountry=»RU»

PersonaId=»0000001″

UserId=»000002″/>

</Response>

</LSX>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

typedefstructEA_HANDLE_MAIN_STACK

{
//— WSA, где содержатся все данные о сетевом соединении c OriginCORE—S_EA_WSA_ADDON wsa_stack_45;
//WSA_Startup((__int64)&_RBX->field_0)
// Стек входящих сообщений в сыром виде, которые были обработаны потоком, отвечающим за получение данных

LPVOID filed_63__array_44;

LPVOID filed_68__array_44;

LPVOID filed_73__array_44;

//IDотправленныхсообщенийWSA_Startup

size_t send_MESSAGE_ID_inc_78;

size_t filed_79_array_2626;

size_t PROBE_105;

// ГОТОВЫЕ ДАННЫЕ

charORIGIN_CORE_VER_10616;

size_t origin_core_ver_len_108;

size_t max_origin_core_ver_len_109;

chargame_id16;

size_t game_id_len_112;

size_t max_game_id_len_113;

size_t reserved__114;

size_t reserved__115;

size_t reserved__116;

size_t reserved__117;

size_t reserved__118;

}

EA_HANDLE,*pEA_HANDLE;

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

История

Denuvo разработан Denuvo Software Solutions GmbH, компанией-разработчиком программного обеспечения, расположенной в Зальцбурге , Австрия. Компания была образована в результате выкупа менеджментом DigitalWorks, подразделения Sony Digital Audio Disc Corporation , разработавшего технологию SecuROM DRM. Первоначально в нем работало 45 человек. В январе 2018 года компания была приобретена более крупной компанией-разработчиком программного обеспечения Irdeto. Разработка программного обеспечения Denuvo началась в 2014 году. FIFA 15 , выпущенная в сентябре 2014 года, была первой игрой, в которой использовалась Denuvo.

3DM , китайская группа варез , впервые заявила о взломе технологии Denuvo в блоге, опубликованном 1 декабря 2014 года, в котором они объявили, что выпустят взломанные версии защищенных Denuvo игр FIFA 15 , Dragon Age: Inquisition и Lords of the Fallen. . После этого 3DM выпустила версию Dragon Age: Inquisition примерно через две недели после выхода этой игры. Общий процесс взлома занял около месяца, что необычно долго для сцены взлома игр. Отвечая на вопрос об этой разработке, Denuvo Software Solutions признала, что «каждая защищенная игра в конечном итоге взламывается». Тем не менее, технологический веб-сайт Ars Technica отметил, что большинство продаж основных игр происходит в течение 30 дней с момента выпуска, и поэтому издатели могут считать Denuvo успешным, если это означает, что на взлом игры потребовалось значительно больше времени. В январе 2016 года основатель 3DM, Bird Sister, объявил, что они должны отказаться от попыток взломать реализацию Denuvo для Just Cause 3 , и предупредил, что из-за продолжающейся тенденции к реализации не будет «бесплатных игр для Играем в мир »в ближайшее время. Впоследствии 3DM решила не взламывать игры в течение одного года, чтобы проверить, повлияет ли такой шаг на продажи игр.

К октябрю 2017 года взломщики смогли обойти защиту Denuvo в течение нескольких часов после выпуска игры, яркими примерами которых являются South Park: The Fractured but Whole , Средиземье: Shadow of War , Total War: Warhammer 2 и FIFA 18 , и все они были взломаны. о датах их выпуска. В другом примечательном случае, Assassin’s Creed Origins , который обернул Denuvo в инструмент безопасности VMProtect, а также проприетарную DRM Ubisoft, используемую для их программного обеспечения для распространения Uplay , обошел свои функции безопасности итальянским коллективом CPY в феврале 2018 года, через три месяца после выпуска игры. . В декабре 2018 года, Hitman 2 «s защита обходили за три дня до его официального релиза в связи с монопольным доступом предзаказа, проводя сравнение с Final Fantasy XV , который был его защита удалена за четыре дня до освобождения.

К 2019 году несколько продуктов, таких как Devil May Cry 5 , Metro Exodus , Resident Evil 2 , Far Cry New Dawn , Football Manager 2019 и Soul Calibur 6 , были взломаны в течение первой недели после выпуска, а Ace Combat 7 — за тринадцать дней. В случае Rage 2 , который был выпущен в Steam, а также собственной Bethesda Launcher от Bethesda Softworks , версия Steam была защищена Denuvo, тогда как версия Bethesda Launcher — нет, что привело к немедленному взлому игры и удалению Denuvo. из Steam через два дня.

Родственный продукт, Denuvo Anti-Cheat, был анонсирован в марте 2019 года и впервые использовался с Doom Eternal после патча 14 мая 2020 года. Однако менее чем через неделю разработчик Doom id Software объявил, что удалит его из игры после отрицательный ответ игроков.

Denuvo + VMProtect = love

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

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

1
2
3
4
5
6

0000000141958B2A488D15EF7ED8FE lea rdx,qword ptr ds<aOriginstartupE>

0000000141958B31B90FA2FFE7mov ecx,E7FFA20F

0000000141958B364C89CBmov rbx,r9

0000000141958B394C89C7mov rdi,r8

0000000141958B3C8D89F15D001B lea ecx,qword ptr dsrcx+1B005DF1

0000000141958B42E8690F0300call<unravel_dump_scy.EA_CALLBACK>

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

1 EA_CALLBACK(0x3000000i64,aOriginstartupE);

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

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

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

1
2
3

0000000141958B3190nop

0000000141958B320FA2cpuid

0000000141958B34FFE7 jmp rdi

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

1
2
3
4
5
6
7
8

// Вот как эти «руки»…

000000014195C350B90F054FC3mov ecx,C34F050F

000000014195C3558D89A9FEB03C lea ecx,qword ptr dsrcx+3CB0FEA9

000000014195C35BE8 A0D80200 call<unravel_dump_scy.malloc_0>

// …трансформируются в «крюки»

000000014195C35090nop

000000014195C3510F05syscall

000000014195C3534FC3 ret

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

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

1
2
3
4
5
6

charout16;//

sub_14199AB30(&ctx);

randr=GetTickCount();

sub_141999F80(&ctx, &randr, 4i64);

sub_14199A8A0(&ctx, out);

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

1
2
3
4
5
6
7
8
9
10
11

_int64 __fastcall sub_14199AB30(__int64 a1)

{

__int64 result;// rax

result=0i64;

*(_DWORD *)(a1+8)=0x67452301;

*(_DWORD *)(a1+12)=0xEFCDAB89;

*(_DWORD *)(a1+16)=0x98BADCFE;

*(_DWORD *)(a1+20)=0x10325476;

*(_QWORD *)a1=0i64;

returnresult;

}

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

1
2
3
4

MD5_Init(&ctx);

randr=GetTickCount();

MD5_Update(&ctx, &randr, 4i64);

MD5_Final(&ctx, out);

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

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

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

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

«Права одного заканчиваются там, где начинаются права второго»

Возвращаясь к истокам, важно отметить, что несмотря на изначальную шумиху вокруг вопроса «бессмертия» новой системы, первая версия Denuvo была «хакнута» за 15 дней. Тот же Splinter Cell: Chaos Theory с пресловутым StarForce на борту, до того как сдать оборону и оказаться на файлообменниках, продержался более четырехсот дней

Игры с защитой от Denuvo

Сама по себе концепция DRM аргументирована тем, что нелегальное использование цифровой, защищенной, продукции наносит огромный ущерб издателю/создателю и всем, кто хоть как-то причастен к процессу. Что в итоге приводит к многомиллионным убыткам и сокращению рабочих мест. Но практически всегда (на самом деле всегда) «легалы» замалчивают об обратной стороне медали, принося на алтарь «антипиратства» законопослушного потребителя. И вот почему (проблемы DRM):

  • Используя непрерывную циркуляцию огромного потока данных, защита серьезно изнашивает некоторые аппаратные составляющие (оперативку, SSD), к тому же, нехило нагружает процессор. Что также приводит к изнашиванию комплектующих и снижению производительности.
  • Ограничения в виде кроссплатформенности. Вместо создания общего аккаунта для пользователей нескольких устройств разработчики часто грешат его отсутствием, предлагая покупать тем, кто уже имеет, например, ПК версию, XBOX-ный вариант.
  • В случае с StarForce — несовместимость системы с некоторыми компьютерами (особенность привода, что актуально для любителей коробочных версий), «агрессивные» драйверы, негативное влияние на безопасность (уязвимость) системы и ряд других, не менее важных факторов.

Этими неудобствами список, к сожалению, не ограничивается.

EA DRM, OEP, dump

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

1
2
3
4

.ooa0000000142D46000publicstart

.ooa0000000142D46000start

.ooa0000000142D46000nop

.ooa0000000142D46001jmp csCore_Activation64_100

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

000007FEF16873E4call qword ptr ds<&GetModuleHandleW>

000007FEF16873EAlea rcx,qword ptr ssrbp+0x10

000007FEF16873EEmov rsi,rax

000007FEF16873F1call<activation64_original.Verify_and_GetModuleHalde>

000007FEF16873F6mov rbx,rax

000007FEF16873F9test rax,rax

000007FEF16873FCje activation64_original.7FEF168741B

000007FEF16873FEnop

000007FEF1687400mov r9,qword ptr dsrbx

000007FEF1687403test r9,r9

000007FEF1687406je activation64_original.7FEF168741B

000007FEF1687408xorr8d,r8d

000007FEF168740Bmov rcx,rsi

000007FEF168740Elea edx,dword ptr dsr8+0x1

000007FEF1687412call r9

000007FEF1687415add rbx,0x8

000007FEF1687419jne activation64_original.7FEF1687400

000007FEF168741Bcall rdi

000007FEF168741Dlea rcx,qword ptr ssrbp+0x6A0

Здесь сложности могут возникнуть разве что при перехвате управления. Дело в том, что игрушку с определенным каналом () должен вызывать сам , да еще иногда по нескольку раз. Пока мы будем аттачиться к процессу — пропустим момент выхода на OEP из .

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

Критика

Denuvo подвергается критике за высокую загрузку центрального процессора (ЦП) и чрезмерное количество операций записи на компоненты хранилища, что приводит к значительному сокращению срока службы твердотельных накопителей (SSD). Denuvo Software Solutions отвергла оба утверждения. В случае Tekken 7 и Sonic Mania Plus Denuvo вызывал значительное снижение производительности в некоторых частях этих игр. Сэм Мачкович из Ars Technica подробно рассмотрел, как Denuvo вызывает снижение производительности, выпустив статью по этому поводу в декабре 2018 года. В декабре 2018 года Джоэл Хруска из ExtremeTech сравнил производительность нескольких игр с включенным и отключенным Denuvo и обнаружил, что у протестированных игр была значительно более высокая частота кадров и меньшее время загрузки, когда Denuvo не использовался. Ричард Ледбеттер из Digital Foundry сравнил производительность пиратской версии Resident Evil Village, в которой была удалена дополнительная защита от копирования Denuvo и Capcom, с выпускной версией для Windows и обнаружил, что версия без DRM работает намного лучше, чем выпущенная игра.

В июле 2018 года Denuvo Software Solutions подала иск против Вокси, 21-летнего болгарского хакера, взломавшего несколько игр, защищенных Denuvo. Вокси был арестован болгарскими властями, а его сайт Revolt был отключен.

Новый зверь…

Поначалу новый механизм работы сбил с толку ветеранов пиратской индустрии. Отключить механизмы проверки уже не представлялось возможным. Первую половину 2021 года можно назвать самым черным за всю историю компьютерного пиратства. Не было ни взломов, ни кряков к большим ААА проектам. Многие отчаявшиеся флибустьеры шли за лицензией. У кого не было средств просто молча или громко завидовали. Третьи обращались к новым торговцам пиратских версий, которые за символическую плату давали офлайн доступ к лицензионным версиям игр.


Сначала 6 августа появился способ запуска почти всех лицензионных игр. DOOM, Rise of the Tomb Raider, Just Cause 3, INSIDE, Total War: Warhammer, Abzû и Homefront: The Revolution можно было использовать без ограничений. Но то была лишь временная лазейка, позволяющая обходить защиту, которую быстро прикрыли.

Игроки расстроились, издатели снова стали почесывать руки, предвкушая скорые прибыли, когда на сцену вышли новые герои. Уже 8 августа хакерская группу CPY (CONSPIR4CY) выдала полноценно взломанную Rise of the Tomb Raider. После чего удары от них пошли одним за другим. Бум! – Inside, Бум! – Doom, Бум! — Deus Ex: Mankind Divided.


После этого в Denuvo видимо схватились за голову и оперативно поменяли алгоритм работы. Новую версию защиты в новых играх так быстро взломать уже не получалось. Следующих взломов пришлось ждать до начала 2017 года.

Но ожидание того стоило. С этого момента пиратские версии игр снова стали выходить регулярно. Конечно, не вместе с релизом игры, как раньше. Но месяцами защита уже не держалась. А подождать пару недель уже было не критично.

Со временем количество хакерских группировок возросло, пиратские релизы сыпались, как из рога изобилия.

Denuvo Anti-Tamper — Защита Denuvo что это?

Неделю назад в Cети появилась информация о том, что украинскому хакеру под ником Bronco при поддержке mkdev и RELOADED удалось обойти «невзломываемою» защиту — Denuvo Anti-Tamper. Такой статус она получила после череды громких заявлений со стороны нескольких авторитетных пиратских групп, занимавшихся взломом и модификацией игр и последующего «тиражирования» различными СМИ. Защита Denuvo хорошо продемонстрировала себя в нескольких игровых проектах, использовавших в качестве защиты данную DRM-систему, тем самым дав ещё одну ложную надежду сторонникам лицензионной продукции. Но как показывает практика, идеальных систем не существует.

Что такое Denuvo

Denuvo — это решение для управления цифровыми правами (DRM) для разработчиков игр. Они могут лицензировать Denuvo и интегрировать его в свои компьютерные игры. Программное обеспечение Denuvo обеспечивает защиту от пиратства. Он разработан для того, чтобы людям было сложнее «взламывать» игры и распространять их бесплатно. По словам Denuvo, он «останавливает обратный инжиниринг и отладку», необходимые для взлома игры.

Нет идеального решения по борьбе с пиратством, но Denuvo обещает, что при выпуске новой игры она будет барьером от хакеров. Другими словами, разработчики игр надеются, что их игры какое-то время не будут взламывать, вынуждая людей, которые в противном случае могли бы использовать пиратскую копию, покупать ее, если они хотят играть в игру.

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8

typedefstructstruct_EA_ACCESS_request

{

char*ContentId;// 1031469 (идентификатор контента)

char*Title;// Unravel (название игры)

char*MultiplayerId;// 1031469 (идентификатор пользователя для сетевой игры)

char*Language;// en_US

}

EA_ACCESS_request,*pEA_ACCESS_request;// Идентификационная карточка приложения

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

1
2
3
4
5
6
7
8

0000000140DDB59Bcall<bf4_dump_scy.sub_140DDD1D0>

0000000140DDB5A0lea rcx,qword ptr ssrsp+0x38

0000000140DDB5A5call<bf4_dump_scy.origin_startup>// А вот и вход!

0000000140DDB5AAmovzx eax,al

0000000140DDB5ADtest eax,eax

0000000140DDB5AFjne bf4_dump_scy.140DDB5B8

0000000140DDB5B1xoral,al

0000000140DDB5B3jmp bf4_dump_scy.140DDB669

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

1
2
3
4
5
6
7
8

00000001416EBC2Dlea rcx,qword ptr ssrsp+0x30

00000001416EBC32call<unravel_dump_scy.sub_1417A5B80>

00000001416EBC37call<unravel_dump_scy.origin_startup>// Вход!

00000001416EBC3Ctest al,al

00000001416EBC3Ejne<unravel_dump_scy.loc_1416EBC50>

00000001416EBC40mov eax,0xC346A20F

00000001416EBC45lea eax,dword ptr dsrax+0x3CB95E01

00000001416EBC4Bjmp<unravel_dump_scy.loc_1416EBDA4>

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

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

1
2
3
4
5
6

0000000140DE30D0xoreax,eax    is_EAH_init

0000000140DE30D2cmp qword ptr ds<EAH>,rax

0000000140DE30D9setne al// setne = Set if Not Equal. Эта инструкция как раз устанавливает байт в указанном операнде в значение 1, если нулевой флаг был очищен

0000000140DE30DCret

0000000140DE3DB0mov rax,qword ptr ds<EAH>get_EAH

0000000140DE3DB7ret

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

1
2
3

0000000141989FD0cmp qword ptr dsrcx+50,FFFFFFFFFFFFFFFF is_connection_established

0000000141989FD5setne al

0000000141989FD8ret

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

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

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

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

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

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

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

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

Вывод

Развитие уровня игровых проектов напрямую зависит от всеобщего развития компьютерной индустрии. А это в свою очередь не обходится без последующих вытекающих. Как пример — пропорционально возрастающее количество «пиратов». Конечно, и это имело свои последствия — разработчиков подтолкнули к поиску обращения ситуации в свою пользу, что привело к выстраиванию громоздкой, несуразной фигуры.

С каждым годом системы защиты становились всё лучше и в тот же момент — неуклюжее. Покупая велосипед, пользователь получал пару совмещенных педалей и дополнительный руль на уже имеющемся «в подарок». Ездить, конечно, можно, но это же неудобно.

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