Мы неод­нократ­но пуб­ликова­ли раз­верну­тые статьи по дизас­сем­бли­рова­нию при­ложе­ний и не собира­емся оста­нав­ливать­ся на дос­тигну­том. Одна­ко мно­гие прог­раммы исполь­зуют раз­личные механиз­мы анти­отладки, из‑за которых под­сту­пить­ся к ним ста­новит­ся неп­росто. Сегод­ня мы погово­рим о том, как вскрыть популяр­ную у раз­работ­чиков защиту Enigma вер­сии 5 и выше, исполь­зующую прод­винутые инс­тру­мен­ты про­тиво­дей­ствия ана­лизу и взло­му.

Бы­тует рас­простра­нен­ное мне­ние, что к катего­рии кру­тых, хороших год­ных защит отно­сят­ся VMProtect и Themida. В них, мол, и крип­тование, и вир­туаль­ные машины, и анти­отладка. Все осталь­ное — так, для лохов и млад­ших школь­ников. Нап­ример, для какой‑нибудь «Эниг­мы» в сети мож­но най­ти кучу тутори­алов и видосов с инс­трук­циями по взло­му, вос­поль­зовав­шись которы­ми, любой нуб может почувс­тво­вать себя кул­хакером.

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

Боль­шинс­тво решений они поза­имс­тво­вали у «взрос­лых» защит (ниже читатель смо­жет в этом убе­дить­ся). Одна­ко, как извес­тно, в этом мире нет ничего нового, и исполь­зование извес­тных решений не дела­ет взлом защиты более прос­тым и при­ятным. Ско­рее наобо­рот. Давай убе­дим­ся в этом, хорошень­ко пощупав Enigma собс­твен­ными руками.

 

Эксперимент

Ра­ди экспе­римен­та ска­чаем какую‑нибудь прог­рамму (для прос­тоты — дот­нетов­скую) и нат­равим на нее, нап­ример, Exeinfo. Пред­положим, ана­лиза­тор опоз­нал упа­ков­щик как Enigma Protector x64 [v.5.0 — 7.0]. Вот и отлично, мыс­ленно выдыха­ем мы: не VMProtect и не Themida, а по Enigma точ­но что‑то мож­но най­ти на YouTube. Лезем в гугл — и прав­да, видосов пол­но, одна­ко мак­сималь­ная лома­емая вер­сия — 4, а по x64 нет вооб­ще ничего.

Ну что ж, дума­ем мы, не боги гор­шки обжи­гают: не мог­ли же они при­думать что‑то прин­ципи­аль­но новое? Поп­робу­ем дей­ство­вать по обра­зу и подобию, авось получит­ся. И вот тут нас под­жида­ет неп­рият­ный сюр­приз.

Прак­тичес­ки все «кул­хакер­ские» ману­алы начина­ются с одной и той же неиз­менной фра­зы: «заг­рузите прог­рамму в отладчик» или «соз­дай­те дамп при­ложе­ния». Имен­но на этом шаге иссле­дова­теля под­сте­рега­ет пер­вый ковар­ный облом. В любимый все­ми x64dbg прог­рамма не гру­зит­ся вооб­ще, дам­перы запущен­ную соф­тину тоже не жела­ют дам­пить, а если это и уда­ется, то на выходе получа­ется совер­шенно нерабо­тос­пособ­ный (и уж и близ­ко не дот­нетов­ский) кусок памяти. Даже в работа­ющем при­ложе­нии .NET не рас­позна­ется от сло­ва «сов­сем», dnSpy ее род­ной не приз­нает и атта­чить не хочет. При­атта­чить прог­рамму уда­ется раз­ве что в x64dbg, но при малей­шей попыт­ке сдви­нуть­ся с точ­ки оста­нова про­цесс мгно­вен­но зак­рыва­ется. В общем, налицо все приз­наки взрос­лой защиты — шиф­рование кода, защита от дам­па и отладчи­ка.

При­дет­ся брать­ся за дело осно­ватель­но. Для начала уста­новим пла­гины ScyllaHide и Scylla, что­бы хоть как‑то зарабо­тала отладка. Бла­года­ря пер­вой тул­зе прог­рамма наконец‑то поз­воля­ет заг­рузить себя в отладчик. Одна­ко радость ока­зыва­ется преж­девре­мен­ной: пос­ле пре­рыва­ния в про­цес­се никакие нас­трой­ки ScyllaHide не поз­воля­ют нам прод­винуть­ся даль­ше, прог­рамма зах­лопыва­ется с завид­ным упорс­твом. Scylla при­дет на помощь чуть поз­же, пока же поп­робу­ем извлечь всю выгоду из малень­кой победы, которую мы толь­ко что одер­жали.

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

push rcx
push rdx
push r8
push r9
mov r8,000B5ED8E
call .00007FF7`BA4D9610
mov r8,0
mov rdx,1
mov rcx,[rsp][000000018]
call .00007FF7`BA4E49A0
mov r8,0
mov rdx,1
mov rcx,[rsp][000000018]
call .00007FF7`BA13E400
pop r9
pop r8
pop rdx
pop rcx
call .00007FF7`BA12A210

Вот тут нам и при­годит­ся ранее уста­нов­ленная Scylla — эту сек­цию мож­но сдам­пить в EXE-файл. Тол­ку, прав­да, от это­го мало: модуль нерабо­тос­пособ­ный. Вдо­бавок это явно не наш иско­мый защищен­ный модуль, дот­нетом там по‑преж­нему не пах­нет, одна­ко пах­нет — сюр­приз! — Delphi. Ока­зыва­ется, Enigma написа­на на дель­фи! Но это вов­се не упро­щает нам жизнь.

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

Поп­робу­ем зай­ти с дру­гой сто­роны. Вни­матель­но пос­мотрев на сдам­плен­ный модуль, мы обна­ружи­ваем, что он не такой уж и бес­полез­ный. У него, вне­зап­но, есть экспор­тиру­емые сим­волы:

0 .00007FF7`BABBD06E EP_RegHardwareID
1 .00007FF7`BABBD073 EP_RegHardwareIDA
2 .00007FF7`BABBD078 EP_RegHardwareIDW
3 .00007FF7`BABBD07D EP_RegCheckKey
4 .00007FF7`BABBD082 EP_RegCheckKeyA
5 .00007FF7`BABBD087 EP_RegCheckKeyW
6 .00007FF7`BABBD08C EP_RegSaveKey
7 .00007FF7`BABBD091 EP_RegSaveKeyA
8 .00007FF7`BABBD096 EP_RegSaveKeyW
9 .00007FF7`BABBD09B EP_RegLoadKey
10 .00007FF7`BABBD0A0 EP_RegLoadKeyA
11 .00007FF7`BABBD0A5 EP_RegLoadKeyW
12 .00007FF7`BABBD0AA EP_RegLoadAndCheckKey
13 .00007FF7`BABBD0AF EP_RegCheckAndSaveKey
14 .00007FF7`BABBD0B4 EP_RegCheckAndSaveKeyA
15 .00007FF7`BABBD0B9 EP_RegCheckAndSaveKeyW
16 .00007FF7`BABBD0BE EP_RegDeleteKey
...

Как нет­рудно догадать­ся, EP — это Enigma Protection, а точ­ки вхо­да ука­зыва­ют на какие‑то очень полез­ные ниш­тяки, содер­жащи­еся внут­ри.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

3 комментария

  1. Аватар

    enc

    15.01.2021 в 13:35

    Спасибо, очень интересно! Хотим ещё!

  2. Аватар

    Lurklessness

    18.01.2021 в 16:58

    Ух, я узнал ещё парочку методов дизассемблирования и ревёрса.

  3. Аватар

    fes-agro-it

    08.02.2021 в 15:45

    Про VMProtect было бы интересно что нибудь подобное почитать. Очень интересно, хотим ещё! )

Оставить мнение