Обход защиты Themida

Хакерский инструмент

В сегодняшней статье поговорим о навороченном протекторе Themida. Рассмотрим простой способ обхода Themida. Я покажу, как сбро­сить три­ал программы защищен­ной Themida.

Еще по теме: Обход защиты StarForce

Статья в образовательных целях и не призывает к каким-либо незаконным действиям. Ни редак­ция spy-soft.net, ни автор не несут ответс­твен­ность за ваши действия.

Обход защиты Themida

В статье не будем  рассматривать «тра­дици­онные» спо­собы обхо­да триала Themida, вмес­то этого рассмотрим самый простой и понятный метод взлома и пат­ча защищенной программы.

Итак, есть приложение, которое использует третью версию Themida. Как обыч­но, нам понадобиться минималь­ный инструментарий (x64dbg и его пла­гины).

Следует отметить, что для обна­руже­ния Themida не стоит полагать­ся на DetectItEasy. С данной защитой луч­ше работа­ют ExeInfo и Nauz File Detector.

ExeInfo
ExeInfo

 

Nauz File Detector
Nauz File Detector

На при­сутс­твие защиты Themida в фай­ле как бы намека­ет наличие меж­ду сек­циями .idata и .pdata двух сек­ций с неп­роиз­носимы­ми наз­вани­ями из 8 слу­чай­ных сим­волов. Но, в треть­ей вер­сии раз­рабы уже не стес­няясь пря­мо называ­ют сек­ции .themida и .boot. Код точно зашиф­рован, упа­кован и не поддается ста­тичес­кому ана­лизу и ревер­су.

Для начала поп­робу­ем заг­рузить защищенную протектором прог­рамму в популярный отладчик x64dbg. Конечно, все пло­хо: при стар­те отладчик про­вали­вает­ся в вир­туаль­ную машину, такую темную на вид, что пропадает желание с ней раз­бирать­ся. Вир­туаль­ная прог­рамма сразу же палит отладчик и кроме этого она отсле­жива­ет тай­минг похож­дения отдель­ных учас­тков сво­его кода.

Сразу при­атта­чить­ся к уже активно­му про­цес­су тоже не получается, раз­рабы Фемиды пре­дус­мотре­ли и это. Поступим чуть умнее  — воз­можно, по прош­лым стать­ям вы пом­ните прекрасный анти‑анти­отла­доч­ный пла­гин ScyllaHide для x64dbg, в котором спе­циаль­но для таких ленивых как я уже есть готовые про­фили под все популяр­ные защиты. Разумеется, подоб­ный про­филь там есть и для Фемиды, прав­да, он нам не очень и поможет: во время загрузки приложения он не спа­сает от анти­отладчи­ка, одна­ко при­атта­чить­ся к запущен­ному при­ложе­нию уже поз­воля­ет.

Тол­ку от этого мало: пос­ле этого бря­ка трас­сиров­ка валит приложение наповал. Но это уже какой-то прог­ресс — далее по нашей стан­дар­тной схе­ме, опро­бован­ной ранее на Obsidium, Enigma и про­чих протекторах, мы про­буем сдам­пить прер­ванный про­цесс при помощи дру­гого спе­циаль­но пред­назна­чен­ного для это­го пла­гина — Scylla.

При­ложе­ние успешно дам­пится. Будем искать точ­ку вхо­да и во мно­гих слу­чаях это­го впол­не хватает, но, наш слу­чай сложный. После загрузки сдам­плен­ного файла в IDA мы обна­ружи­ваем, что наша программа хорошенько обфусци­рова­на: на боль­шинс­тве вызовов импорти­руемых фун­кций (в час­тнос­ти, на биб­лиотеч­ных вызовах QT, на котором написа­на ана­лизи­руемая нами прог­рамма), сто­ят заг­лушки, ведущие на изрядной дли­ны цепоч­ки безум­ного код подоб­ного вида:

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

По счастью, умные люди уже под­суети­лись и соз­дали для нас чудес­ный пла­гин Themidie, который поз­воля­ет бес­проб­лемно трас­сировать при­атта­чен­ный про­цесс под Themida. Для его исполь­зования необ­ходимы пос­ледние вер­сии отладчи­ка x64dbg и пла­гина ScyllaHide, про которые я писал выше.

Скачайте с GitHub пос­леднюю вер­сию Themidie и извле­ките Themidie.dll и Themidie.dp64 в пап­ку пла­гинов x64dbg. В ито­ге там дол­жны обя­затель­но при­сутс­тво­вать четыре фай­ла:

  • Themidie.dll
  • Themidie.dp64
  • HookLibraryx64.dll
  • ScyllaHideX64DBGPlugin.dp64

Заг­ружа­ем x64dbg и с чувс­твом пол­ного удов­летво­рения обна­ружи­ваем в под­меню Plugins (Модули) допол­нитель­ный пункт Themidie. В опци­ях ScyllaHide отклю­чаем все, кро­ме чек­бокса Kill Anti-Attach.

Нас­трой­ка пла­гина Themidie
Нас­трой­ка пла­гина Themidie

За­пус­каем иссле­дуемую прог­рамму из под­меню Plugins-Themidie-Start. Если мы все сде­лали пра­виль­но, то дол­жно появить­ся вот такое окно.

За­пуск прог­раммы в отладчи­ке
За­пуск прог­раммы в отладчи­ке

Как сле­дует из тек­ста в этом окош­ке, прог­рамма при запус­ке не заг­ружа­ется сра­зу в отладчик (более того, ее и при всем желании при­нуди­тель­но заг­рузить не получит­ся — Themida спа­лит наш отладчик при заг­рузке даже так).

Одна­ко к запуще­ной столь хит­рым обра­зом прог­рамме мож­но при­атта­чить­ся, пос­ле чего спо­кой­но ста­вить бря­ки и отла­живать код, не боясь анти­отладчи­ка, что нам, собс­твен­но и тре­бова­лось. Теперь, не испы­тывая ни малей­ших пре­пятс­твий, обна­ружи­ваем в необ­фусци­рован­ной час­ти кода раз­вилку обхо­да про­вер­ки лицен­зии:

Ес­ли бы на при­ложе­нии не было навеше­но «Фемиды», мож­но было бы пить шам­пан­ское: делов то — поп­равить пару бай­тиков условно­го перехо­да je. Но тут начина­ется самое инте­рес­ное. Исходный код у нас зашиф­рован и упа­кован, ревер­сить вир­туаль­ную машину Themida, как мы уже успе­ли убе­дить­ся, — вещь дос­таточ­но тру­доем­кая. При­чесать и деоб­фусци­ровать сдам­плен­ный чуть рань­ше код, конеч­но, чуть поп­роще, но все рав­но задача выг­лядит весь­ма неп­ростой.

Са­мым лег­ким вари­антом кажет­ся исполь­зование лоаде­ра или инлайн пат­ча. Что­бы не кодить лоадер, поп­робу­ем вто­рой вари­ант. Суть в том, что если нель­зя про­пат­чить код самого защищен­ного при­ложе­ния, то мож­но поп­робовать сде­лать это из какой‑нибудь незащи­щен­ной внеш­ней биб­лиоте­ки, бла­го, QT-шных либ рядом с прог­раммой валя­ется в изо­билии, и кон­тро­ля целос­тнос­ти на них нет.

Слег­ка поковы­ряв код, обна­ружи­ваем бли­жай­ший к нашей раз­вилке обфусци­рован­ный вызов фун­кции bool __cdecl QWidget::isVisible(void) биб­лиоте­ки qt5widgets.dll.

Пос­ле про­хож­дения всей пос­ледова­тель­нос­ти обфусци­рован­ного кода вызов упи­рает­ся в коротень­кую реали­зацию дан­ной фун­кции внут­ри qt5widgets.dll, ее код мы и будем исполь­зовать для авто­пат­ча основной прог­раммы:

Сле­дующая слож­ность зак­люча­ется в том, что мы не можем так прос­то взять и поп­равить код исполня­емо­го про­цес­са из него же. Зна­чит, надо искать перемен­ные в сек­ции дан­ных, прав­ка которых дала бы тот же эффект. Итак, нам надо добить­ся, что­бы вызов метода

воз­вра­щал в AL ненуле­вое зна­чение.

Еще нем­ного покопав­шись в отладчи­ке, прев­раща­ем дан­ный метод вот в такую пос­ледова­тель­ность дей­ствий:

Это озна­чает, что для того, что­бы прог­рамма почувс­тво­вала себя лицен­зион­ной, нуж­но уста­новить по адре­су:

любое ненуле­вое зна­чение бай­та (нап­ример, 1).

Алго­ритм наших дей­ствий таков:

Вы­пол­няем исходный код метода bool __cdecl QWidget::isVisible(void), резуль­тат в регис­тре AL, регистр RCX прог­рамме уже не инте­ресен, его мож­но исполь­зовать в сво­их целях, что мы и сде­лаем.

Про­верим, из нуж­ного ли мес­та был выз­ван метод isVisible, пос­коль­ку сек­ция кода садит­ся каж­дый раз на раз­ные адре­са, самое прос­тое и более‑менее надеж­ное — про­верять пос­ледние нес­коль­ко байт адре­са, нап­ример 16 бит, иско­мый адрес вызова дол­жен быть:

Ад­рес вызова мы так­же исполь­зуем для отно­ситель­ной адре­сации перемен­ной:

Нес­ложно пос­читать, что сме­щение меж­ду ее адре­сом и адре­сом вызова рав­но 0x5AAB44C.

На вся­кий слу­чай про­веря­ем зна­чение этой перемен­ной (на момент вызова нашего isVisible она зап­росто может быть еще не ини­циали­зиро­вана) и уста­нав­лива­ем зна­чение [[[7FF6F47F6EF8]+10]+A1E] в 1.

Те­перь, ког­да алго­ритм понятен, ищем в коде биб­лиоте­ки qt5widgets.dll бли­жай­ший пус­той кусок дос­таточ­ной дли­ны и уста­нав­лива­ем обра­бот­чик isVisible на него. Поп­равлен­ный и допол­ненный код isVisible выг­лядит так:

Все это кажет­ся каким‑то извра­щени­ем, но это работа­ет: внеш­няя стан­дар­тная биб­лиоте­ка QT при обра­щении к ней из нуж­ного мес­та дела­ет нак­рытую Themida прог­рамму «лицен­зион­ной», даже не модифи­цируя ее код.

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

Еще по теме: Отладка программ с помощью WinDbg

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

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