Сны Фемиды. Ломаем виртуальную машину Themida

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

warning

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

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

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

Но мы не из пуг­ливых! Заг­ружа­ем прог­рамму в наш любимый отладчик x64dbg и при помощи опи­сан­ного мною в пре­дыду­щих стать­ях замеча­тель­ного пла­гина ScyllaHide под­бира­ем анти­анти­отла­доч­ную кон­фигура­цию (Themida). Теперь вклю­чаем уже опро­бован­ный нами в боях пла­гин Themidie и наконец получа­ем воз­можность поковы­рять­ся в рас­шифро­ван­ном и рас­пакован­ном коде (вклю­чая его трас­сиров­ку). Что­бы рас­шифро­ван­ный код было удоб­нее изу­чать, я сдам­пил его еще одним опи­сан­ным ранее пла­гином — Scylla. Если теперь мы заг­рузим сдам­плен­ный код в дизас­сем­блер IDA, то уви­дим при­мер­но такую кар­тину.

Cдам­плен­ный код в дизас­сем­бле­ре IDA

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

Поб­родив нем­ного отладчи­ком по деб­рям кода и слег­ка расс­тро­ившись, перехо­дим к более прог­рессив­ному методу работы. Поп­робу­ем отсле­дить и про­ана­лизи­ровать трас­су меж­ду вызыва­емы­ми невир­туали­зиро­ван­ными фун­кци­ями. В качес­тве отправ­ного пун­кта берем фун­кцию HTTP-зап­роса лицен­зии на сер­вер, бла­го она по понят­ным при­чинам не обфусци­рова­на. Ста­вим на нее точ­ку оста­нова и при ее дос­тижении жмем Ctrl-F9, выпол­няя фун­кцию до воз­вра­та в обра­бот­чик шитого кода, из которо­го она вызыва­ется.

На вхо­де обна­ружи­ваем такой огромный кусок бес­смыс­ленных команд, что его бес­полез­но пытать­ся прой­ти вруч­ную. Воз­ложим эту тяж­кую задачу на отладчик. Для это­го откро­ем вклад­ку «Трас­сиров­ка» (край­няя спра­ва) и пра­вой кноп­кой мыши выберем «Начать выпол­нение трас­сиров­ки». Затем для быс­тро­ты запус­каем трас­сиров­ку через Ctrl-Alt-F8 (трас­сиров­ка с обхо­дом). Памятуя о том, что невир­туали­зиро­ван­ный код находит­ся в сек­ции с мень­шими адре­сами, в качес­тве усло­вия оста­нов­ки ста­вим RIP до начала сек­ции, содер­жащей вир­туали­зиро­ван­ный код.

Ста­вим RIP до начала сек­ции, содер­жащей вир­туали­зиро­ван­ный код

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

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *