Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Themida или «Фемида» — одна из самых навороченных защит для софта. Вместе с WMProtect ее относят к настолько суровым протекторам, что некоторые программисты, которым жаль денег на честную покупку этих инструментов (а стоят они недешево), просто имитируют их наличие, что отпугивает ленивых и неопытных хакеров. Сегодня мы поговорим о том, как сбросить триал приложения, защищенного настоящей Themida.
warning
Статья написана в исследовательских целях, имеет ознакомительный характер и предназначена для специалистов по безопасности. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Использование или распространение ПО без лицензии производителя может преследоваться по закону.
Несмотря на широкую популярность Themida, высокую стоимость взлома и, соответственно, большое количество мануалов и видеоуроков в сети, они почти всегда бесполезны. Они в основном описывают снятие старых версий защиты 1 и 2. Уже третья версия устроена настолько сложнее, что в паблике нет универсальных инструментов и скриптов для ее взлома или обхода. И даже на старых версиях всегда находятся какие‑то нюансы, исключающие возможность универсального однокнопочного решения.
Поэтому я не буду останавливаться сейчас на «традиционных» способах обхода «Фемиды», а вместо этого опишу наиболее простой и понятный метод исследования, взлома и патча одного из защищенных графических приложений. Эта программа использует Themida третьей версии, а мы, как обычно, вооружимся лишь минимальным набором доступных инструментов (x64dbg и его плагины).
Нужно заметить, что для обнаружения Themida не следует сильно полагаться на DetectItEasy. С этим протектором гораздо лучше работают Nauz File Detector и ExeInfo.
Nauz File Detector
ExeInfo
Визуально же на присутствие «Фемиды» в файле как бы намекает наличие между секциями .idata
и .pdata
двух секций с непроизносимыми названиями из 8 случайных символов. Впрочем, в третьей версии разработчики уже не стесняясь прямо называют секции .themida
и .boot
. Код гарантированно зашифрован, упакован и статическому анализу и реверсу не поддается.
Поэтому попробуем загрузить накрытую Themida программу в наш любимый отладчик x64dbg. Разумеется, все плохо: при старте отладчик проваливается в виртуальную машину, столь страшную на вид, что отбивается всякая охота с ней разбираться. Хотя в отдельных случаях этого не избежать, скажем, при привязке конкретной программы к компьютеру или донглу. В любом случае этот путь непрост и тернист: виртуальная программа мгновенно палит отладчик, вдобавок она отслеживает тайминг похождения отдельных участков своего кода.
Сходу приаттачиться к уже активному процессу тоже нельзя, разработчики и это предусмотрели. Попробуем сделать чуть хитрее — возможно, по прошлым статьям ты помнишь замечательный анти‑антиотладочный плагин ScyllaHide для x64dbg, в котором специально для ленивых уже подготовлены готовые профили под каждую популярную защиту. Конечно же, подобный профиль там есть и для Themida, правда, не шибко сильно он нам поможет: при загрузке программы он не спасает от антиотладчика, однако приаттачиться к запущенному приложению уже позволяет.
Толку, правда, с этого немного: после такого бряка трассировка валит программу наповал. Но это уже прогресс — далее по стандартной схеме, опробованной нами ранее на Enigma, Obsidium и прочих, пробуем сдампить прерванный процесс при помощи другого специально предназначенного для этого плагина — Scylla.
Приложение дампится успешно. Как обычно, надо искать точку входа и во многих случаях этого вполне достаточно, однако, наш случай непростой. Загрузив сдампленный файл в IDA мы обнаруживаем, что наше приложение неплохо обфусцировано: на большинстве вызовов импортируемых функций (в частности, на библиотечных вызовах QT, на котором написана анализируемая нами программа), стоят заглушки, ведущие на изрядной длины цепочки безумного код подобного вида:
00007FF6F4FA521D | E9 DB2F5F00 | jmp 7FF6F55981FD00007FF6F4FA5222 | E9 E5E31D00 | jmp 7FF6F518360C00007FF6F4FA5227 | E9 25064500 | jmp 7FF6F53F585100007FF6F4FA522C | E9 375E5900 | jmp 7FF6F553B06800007FF6F4FA5231 | 73 D5 | jae 7FF6F4FA520800007FF6F4FA5233 | CF | iretd00007FF6F4FA5234 | 0026 | add byte ptr ds:[rsi],ah00007FF6F4FA5236 | 49:89ED | mov r13,rbp...00007FF6F55981FD | 48:83EC 08 | sub rsp,800007FF6F5598201 | E9 E6DB0200 | jmp 7FF6F55C5DEC...00007FF6F55C5DEC | 48:83EC 08 | sub rsp,800007FF6F55C5DF0 | 48:83EC 08 | sub rsp,800007FF6F55C5DF4 | 48:81EC 08000000 | sub rsp,800007FF6F55C5DFB | 48:891C24 | mov qword ptr ss:[rsp],rbx00007FF6F55C5DFF | 8F0424 | pop qword ptr ss:[rsp]00007FF6F55C5E02 | 8F0424 | pop qword ptr ss:[rsp]00007FF6F55C5E05 | E9 83000100 | jmp 7FF6F55D5E8D...
По‑хорошему было бы неплохо отфильтровать все адреса подобного импорта и написать деобфускатор, но, учитывая их количество, задача выглядит муторной, а я обещал относительно простой и комфортный путь (насколько это возможно вообще в случае столь серьезной защиты). Поэтому самое время приступить к анализу логики программы в процессе ее работы, то есть, изыскать возможность для ее трассировки.
Источник: xakep.ru