Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


Взлом протектора Themida




Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

In-line patch Themida v ~ 1.8x-1.9x


Автор: PE_Kill

Жертва: ResMan (в папке Victim)

Отладчик: Я использовал свою сборку, но подойдет и HanOlly китайцев

PlugIns: Phantom by Hellspawn & Archer


Один мой хороший друг попросил меня пропатчить программу, накрытую Themid’ой, что я и сделал, затратив на это чуть больше получаса. Но, так как, статей на эту тему нет, я решил поделиться своим небогатым опытом. Themida - самый простой протектор из коммерческих, в плане патча. Мы разберем 2 способа его инлайна.


Первый способ. Подмена CRC.

Немного поисследовав темиду я разобрался, что она не использует библиотеки ADVAPI32, KERNEL32 и USER32, а подгружает их с диска, настраивает и работает с их виртуальными копиями. Значит надо ставить либо бряки на виртуальные копии библиотек (а для этого их надо сначала найти в памяти), либо смотреть какие функции вызывают интересующие нас функции из NTDLL.

Пример:

Функция: CreateFileA

взлом Themida

Видим, что она вызывает CreateFileW опять же из kernel32, значит перейдем на CreateFileW и прокрутим вниз:

взлом Themida

Видим что она вызывает ZwCreateFile из NTDLL, а вот NTDLL Themida не виртуалит. Значит ставим бряк на ZwCreateFile и жмем F9. В окне стэка видим следующее (правда у вас не будет описания параметров функции, я сам их добавлял в OllyDbg):

взлом Themida

Видим, что Themida пытается открыть драйвер SoftIce. Тепрь жмем F9 до тех пор, пока не увидим, что протектор открывает сам себя.

взлом Themida

Теперь потрассируем по F8 пока не попадем в VirtualCreateFileW. Теперь мы в виртуальной kernel32. Я предположил, что дальше протектор будет действовать по наработанной схеме: CreateFileA->CreateFileMapping->MapViewOfFile-ProtCalcCRC. Под ProtCalcCRC я подразумеваю некую функцию в протекторе, отвечающую за подсчет контрольной суммы. Как видите быстрее всего добраться до функции генерации контрольной суммы, перехватив MapViewOfFile. Чтобы нам ее поймать, перейдем на MapViewOfFile и скопируем весь ее код. Теперь вернемся назад и поищем этот код в виртуальной kernel32. После того, как нашли, ставим на него бряк и F9. Троссируем до ret и смотрим, что у нас в eax.

взлом Themida

А там у нас база подмапленного файла. Теперь нам нужно найти процедуру генерации контрольной суммы. Логично предположить что функция будет читать байты из образа в памяти и мы можем поймать этот процесс, поставив Memory breakpoint. Переходим на адрес из eax и ставим Memory breakpoint на чтение на первые 4 байта. F9 и тормозимся тут:

взлом Themida

По количеству команд ADC можно предположить, что это и есть генерация контрольной суммы, но почему адреса команд соответствуют какой то виндовой библиотеке? Смотрим, что это за библиотека:

взлом Themida

Так, ясно. Теперь определим, что это за функция. Дотрассируем до команды retn 0C и выполним ее. Попали снова в imagehlp.dll. Значит эта функция вызвала ту, в которой мы сейчас были. Ищем начало функции, прокручивая окно вверх:

взлом Themida

Чтобы опознать функцию, нужно воткнуть куда-нибудь jmp, указывающий на начало функции и OllyDbg автоматом ее подсветит. Обычно я пишу байты ebfe в начало функции, так быстрее и проще:

взлом Themida

Смотрим MSDN:

взлом Themida

Нас интересуют параметры FileLength и CheckSum. Чтобы узнать адреса этих параметров достаточно трассировать, пока не попадем в тело протектора и прокрутить окно стэка на 4 DWORD’а вверх.

взлом Themida

FileLength на самом деле нам пока не понадобится, это значение нам пригодится при втором способе инлайна, а пока запишем адрес CheckSum и посмотрим, что по этому адресу. А там у нас 0020C65E. Это и есть контрольная сумма файла, запишем и ее. Теперь запишем текущий eip (а стоим мы прямо в протекторе):

взлом Themida

, тут мы будем подменять контрольную сумму. Итого получилось:

AddrOfReplaceCRCSumProc: 00839824

AddrOfCRCSum: 008346C8

CRCSum: 0020C65E


Теперь нужно найти место под патч. Место в принципе много, но надо знать, как оно используется протектором. У протектора в конце одна большая секция на 1/3 состоящая из нулей. При загрузке прот. Распаковывает и копирует сжатый загрузчик из верхней части секции в нижнюю. Кстати то место, которое мы хотим пропатчить для подмены CRC тоже пока упаковано и содержит только нули. Для того, чтобы загрузчик распаковался нужно чуть - чуть потрассировать от EP и увидим такое место:

взлом Themida

Ставим бряк на второй call и F9 теперь начнем поиск нулей, которые не тронула распаковка загрузчика. Быстрее всего это сделать так. Сдампить файл на диск с названием типа Dumped_u. Загрузить в отладчик запакованный файл и сдампить пряпо на EP (чтобы выровнять секции в памяти) типа Dumped_p. А потом сравнить файлы. Там, где над распакованными байтами будут нули, и есть наше место под патч:

взлом Themida

Выше, вплоть до 0030CCA8 идут нули. Значит наш патч будет располагаться, начиная с адреса 0070CCA8 (RVA: 0030CCA8+ImageBase: 00400000). Теперь нам нужно определиться, что мы будем патчить. Как я уже сказал в том месте, что нам нужно пока лежат нули, а как там становятся ненули я уже объяснил. Получается нам нужно перехватить второй call от EP:

взлом Themida

Ну а на 0070CCA8 восстанавливаем потертую команду: jmp 0058309C.

Сохраняем, пробуем запустить:

взлом Themida

Вот это и будем фиксить. Перезапускаем, ставим бряк на второй call от EP, F9. Теперь загрузчик распакован. Смотрим, что у нас по адресу AddrOfReplaceCRCSumProc(00839824)

взлом Themida

Код распакован, но не расшифрован. Теперь есть 2 варианта, как поставить туда перехват. Либо подменить покриптованые байты так, чтобы после расшифровки они превратились в нужные нам команды, либо перехватить место, где этот код уже расшифрован. Я решил посмотреть как расшифровываются эти байты. Для этого ставим Memory breakpoint на запись на 6-7 байт ниже интересующего нас адреса, так как расшифровка идет снизу вверх (это я позже узнал) и F9. Тормозим тут:

взлом Themida

Хо-хо! Это и есть дешифровка? Мы легко обратим эту функцию, чтобы она зашифровала нужные нам команды. Для этого заменим обе команды ADD на SUB. Для начала определимся куда мы будем перенаправлять код после подсчета CRC. Перейдем на наш патч и вместо jmp 0058309C вставим такой код:

взлом Themida

Т.к. мы пока не знаем как выглядит зашифрованная команда jmp RplaceProc, но зато мы теперь знаем где кончается наш патч. Туда и будем прыгать после подсчета CRC.

Перейдем в окно дампа и там перейдем на адрес 00839824. Теперь аасемблируем нужную нам команду.

взлом Themida

Теперь заменяем в дешифровщике обе ADD на SUB и прогоняем цикл, пока все байты нашего джампа не изменятся:

взлом Themida

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

взлом Themida

Теперь после подсчета CRC протектор перейдет на наш патч (0070CCA8). Первым делом мы восстановим затертые байты, но не все, т.к. там много морфа:

push ebx

mov ebx, esp

add ebx, 4 <- мусор

sub ebx, 4 <- мусор


Восстановим только первые 2 команды. Дальше мы подменим CRC и вернем управление протектору:

взлом Themida

Сохраняем всё это дело и запускаем. Всё работает! Теперь найдем место перехвата, где секция кода уже распакована. Ставим Memory breakpoint на запись на секцию кода и трассируем, пока не дойдем до такого места:

взлом Themida

В принципе нам нужно поставить сюда перехват и пропатчить секцию кода, но при подмене CRC это место еще зашифровано, и подменить зашифрованные байты не так просто, т.к. тут уже применено многослойное шифрование. А вот если мы зайдем в call eax по адресу 00847DDB, то окажемся в верхней части загрузчика, которая расшифровывается вместе с кодом, который проверяет CRC. Поэтому мы можем после подмены CRC поставить перехват на эту функцию. Посмотрим как она выглядит. Для этого зайдем в call eax:

взлом Themida

Будем перехватывать call 007DCB38 по адресу 007DCB30. Единственная проблема заключается в том, что эта функция вызывается из многих мест ранее и нам нужно будет определить по каким либо признакам, что функция вызвалась из нужного нам места. Дотрассируем до этого call, выполним его и посмотрим в стэк:

взлом Themida

По адресу esp+0C находится адрес возврата из этой функции. Будем сравнивать его с 00847DDD и когда они будут равны, можно патчить код. Сначала допишем наш патч, чтобы знать, куда делать перехват:

взлом Themida

Значит перехват будем делать на 0070CCDA. Заменяем call 007DCB38 на call 0070CCDA, смотрим какие байты получились, исправляем патч фиксим секцию кода и восстанавливаем затертую команду:

взлом Themida

Т.к. в этой статье я описываю непосредственно in-line, а не взлом программы, то я в качестве проверки просто пишу байт 0xCCh по адресу 00401000h. Теперь сохраняем всё это. In-line готов!



Второй способ. Нахождение дельты.

После всего, мною описанного, вполне логична фраза: “Нихрена себе самый простой протектор из коммерческих, в плане патча!”. Но это не пустые слова, сейчас я их обосную.

При подсчете CRC я сказал что функция CheckSumMappedFile сплошь состоит из команд ADD и ADC, стало быть, можно добавить в файл такое число, которое стабилизирует контрольную сумму. Для проверки этой теории я просто возьму непропатченый файл и поменяю в нем названия секций:

взлом Themida

Запускаем и снова видим плохое сообщение о вирусах. Теперь закодим простую утиль. Я просил записать параметр FileLength, при подсчете CRC, теперь он нам понадобится. Утиль будет подгружать файл так же, как и протектор. Вписывать в offset DOSHeader+4 число 00000000h, подсчитывать контрольную сумму, если не равна требуемой, то вписывать в offset DOSHeader+4 число 00000001h, и т.д., пока не найдем число, с которым контрольная сумма совпадает. Утиль идет вместе со статьёй, можете посмотреть исходный код там. Запускаем, ждем и видим:

взлом Themida

Данную утиль можно адски оптимизировать, но мне она нужна разово, так что мне насрать на время ожидания :). Теперь откроем жертву в любом HEX редакторе и впишем эту дельту во второй dword от начала файла:

взлом Themida

Сохраняем, запускаем и… Работает! Какой еще вы знаете коммерческий протектор, который можно пропатчить не запуская отладчик/дизассемблер?


Best regards,

PE_Kill, 25/11/2007



Скачать статью "Взлом протектора Themida" в авторском оформление + файлы.
пароль архива на картинке



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS