Pull to refresh

Защита Win32 и .NET приложений: обзор протектора Themida (X-Protector)

Reading time 10 min
Views 52K
Этот обзор посвящен Themida (в прошлом X-Protector), одному из самых мощных и надежных протекторов Win32 приложений. Поскольку Themida совсем недавно понадобилась мне для одного из моих приложений, я решил написать по ней небольшой обзор. Заодно попросил автора ответить на некоторые интересующие меня вопросы. Думаю, ответы будут вам тоже интересны. Результаты этого небольшого интервью ищите в конце статьи.

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




Базовая информация



Фактически, существует четыре продукта на базе технологии Themida.

Basic версия от Professional отличается только отсутствием умения работать с .NET приложениями. Все, о чем дальше у нас пойдет речь, работает как в Themida, так и в WinLicense.
  • Themida – это сам протектор, который является основным предметом данной статьи.
  • WinLicense – это Themida с добавлением возможности защиты приложений на основе разного рода серийных номеров. SDK WinLicense сам умеет генерировать эти серийные номера, проверять их, безопасно хранить, привязывать к железу, создавать триальные серийники с истечением срока к указанной дате или через указанное число запусков, создавать приложения, защищенные паролем и так далее.
  • X-Bundler – это плагин для Themida и WinLicense, который позволяет вам встраивать в защищенное приложение внешние файлы. Например, можно встроить файл справки или *.mp3 файл. Причем, обращаться к этому файлу из приложения можно как к внешнему, лежащему на диске. Приложение и знать не будет, что файл защищен Themida и находится внутри вашего *.exe. Также можно встроить сборки, используемые .NET приложением, внутрь основного *.exe файла.
  • WinLicense DLL Control – это плагин для WinLicense, с помощью которого можно реализовать свои варианты защиты на базе серийных номеров.
  • CodeVirtualizer – это маленький независимый кусочек Themida, который позволяет исключительно преобразовывать указанные функции внутри вашего приложения в код для виртуальной машины Themida. Никакой другой защиты он не обеспечивает (защиты от отладки, шифрования, проверок целостности и прочего в нем нет). Позволяет защищать как x32, так и x64 приложения, включая драйверы.

Возможности автоматической защиты Themida


Сначала о «скучных банальностях».
  • Антиотладчик. Поддерживается как обнаружение стандартных отладчиков, так и отладчиков уровня ядра. Есть также режим агрессивного поиска, но в этом случае приложение может отказаться запускаться на компьютерах с активными антирусами, руткитами или под Wine.
  • Антидампер. Themida защищает приложения постоянно. Дамп памяти приложения на диск с последующим запуском не снимет защиту (кто бы сомневался.… Такие примитивные методы уже давно не работают)
  • Обфускация точки входа (OEP). Themida прячет точку входа в библиотеку или приложение.
  • Шифрование ресурсов. Если в ваше приложение включены какие-либо ресурсы (иконки, файлы и так далее), они будут зашифрованы и расшифрованы только при обращении к ним.
  • VMWare/VirtualPC совместимость. Можно активировать этот режим для того, чтобы защищенное приложение могло запускаться под гипервизорами.
  • Заворачивание обращений к API Windows. Themida прячет информацию о функциях Windows API, которые вызывает ваше приложение. Информация о требуемых для запуска библиотеках также недоступна взломщику.
  • Защита приложения от модификации. Themida может проверять целостность приложения при его запуске, не позволяя запуститься измененной копии приложения. Можно активировать режим, при котором приложение после защиты можно будет беспрепятственно подписать .
  • Защита памяти приложения от модификации в процессе выполнения (полезно, если вы разрабатываете, например, игру).
  • Технология мутации кода. Весь код ядра Themida, который связывается с вашим приложением, подвергается мутации и «размазыванию». Каждый раз этот код генерируется заново, используя техники виртуализации (см. далее).
  • Защита от мониторинга файлов и реестра. Themida не позволяет внешним программам отслеживать обращения защищенного приложения к файлам или реестру.
  • Сжатие. Наложение защиты приводит к довольно сильному увеличению размера исполнимого файла на диске. Для уменьшения этого размера Themida поддерживает сжатие как самого приложения (со встроенным кодом защиты), так и его ресурсов.
  • Themida умеет защищать формы Delphi/C++ Builder от специальным образом. Содержимое форм (фактически, *.dfm файл) нельзя будет извлечь как из *.exe, так во время выполнения приложения.

Практически все описанные возможности можно включать/отключать по вашему желанию.

Технология CodeReplace


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



Виртуальная машина


Виртуальная машина Themida – один из самых сильных способов защиты приложения. Суть его состоит в том, что части вашего кода заменяются сгенерированным ассемблерным кодом, но не родным для Intel процессоров, а кодом для абстрактного виртуального процессора со своей системой команд и внутренней структурой. Themida каждый раз случайным образом генерирует план его архитектуры. Таким образом, в коде защиты становится сложно разобраться.
Themida поддерживает несколько типов виртуальных процессоров:
  • CISC. Базовая защита, защищенный код относительно быстро выполняется.
  • CISC-2. Расширенная защита, код занимает больше места, чем в случае CISC. Чуть более медленный.
  • RISC-64. Каждая виртуальная инструкция занимает 64 бита, защита сильнее, чем у CISC, но защищенный код выполняется медленно.
  • RISC-128. Усовершенствованный супермедленный и суперзащищенный вариант RISC-64

Для CISC процессоров поддерживается одновременное встраивание в защищенное приложение нескольких виртуальных процессоров одного типа, но с разной системой команд. Это повышает защиту, но увеличивает размер исполняемого кода приложения.

Генерация шума позволяет смешивать производящие полезную работу инструкции с ничего не значащими для еще большего затруднения работы хакеру.

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



Прочее


  • Themida позволяет прятать приложение от PE-сканеров, которые определяют, чем защищено приложение.
  • Доступны возможности локализации интерфейса приложения (окна с ошибками и системными сообщениями) и вставка заставок (все же время запуска защищенного приложения увеличивается на 500-5000 миллисекунд в зависимости от настроек защиты, надо чем-то занять пользователя в это время).
  • Themida поддерживает управление с командной строки, что позволяет интегрировать ее в Build-систему.

Теперь чуточку о грустном. Если даже вы используете все, что перечислено выше, ваше приложение все равно могут разломать. Чтобы максимально затруднить работу хакеру, следует использовать макросы Themida. О них сейчас и поговорим.

Макросы Themida.


Макросы Themida – это последовательности байт, встраиваемые в приложение, которые никак не влияют на его работу до тех пор, пока вы не защитите приложение Themida. Они имеют для протектора специальное значение. Фактически, они информируют Themida о тонкостях внутренней структуры вашего кода, позволяя эффективнее защищать его.
Макросы имеют маркеры начала и конца, определяя объем исходного кода, к которому они применяются. Готовые макросы в SDK есть для ассемблера, C, D, Delphi и VisualBasic / Pure Basic. Но в принципе, их можно за две минуты переделать под любой язык, который поддерживает ассемблерные или просто байтовые вставки в код. Здесь я буду использовать Delphi синтаксис, который мне наиболее близок.

Внимание! В приложениях .NET и в приложениях Visual Basic, скомпилированных в P-код, макросы использовать нельзя.

VM


Макрос VM ограничивает область кода, который Themida должна виртуализировать (превратить в инструкции для виртуальной машины, настройки которой вы задаете в интерфейсе). Используется следующим образом:

{$I VM_Start.inc}
// код программы
{$I VM_End.inc}


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

Ограничения:
  • Непосредственно внутри блока не должно быть работы с исключениями (try, raise)
  • Внутри блока нельзя использовать другие макросы


VM_WithLevel


Макрос во всем подобен макросу VM, но обеспечивает дополнительную защиту, увеличивая уровень виртуализации на заданную вами величину. Используется он также. Для указания требуемого уровня виртуализации придется отредактировать соответствующий *.inc файл в Delphi (см. комментарий в нем). Большое значение уровня виртуализации приведет к сильному раздуванию кода. При уровне 0, макрос ведет себя так же, как макрос VM.

Ограничения такие же, как и у макроса VM.

CodeReplace


Макрос помечает код для обработки технологией CodeReplace, о которой мы говорили выше. Используется так же, как и макрос VM.
Ограничения такие же, как и у макроса VM.
Encode
Макрос отмечает блок кода, который требуется зашифровать и расшифровывать исключительно перед исполнением, зашифровывая назад при выходе из блока. Используется также, как и макрос VM. Этот макрос обеспечивает более слабую защиту, чем макросы VM и CodeReplace, но код под ним работает намного быстрее.

Ограничения:
  • Нельзя использовать в DLL
  • Внутри блока нельзя объявлять переменные или выходить из процедуры (return / exit)


Clear


Макрос отмечает блок кода, который будет удален из процесса после первого вызова. Этот макрос рекомендуется использовать для операций, которые ваша программа выполняет только один раз на запуск. Например, расчет сеансовых ключей для обмена данными или проверка наличия лицензионного ключа. Используется так же, как и макрос VM.

Ограничения:
  • Нельзя использовать в DLL


Unprotected


Помечает блок, который будет удален из приложения после защиты. Например, с его помощью можно сделать так, чтобы приложение сообщало, если оно не защищено. Используется также, как и все описанные макросы. Ограничений не имеет.

CheckProtection


В демонстрационной версии Themida этот макрос недоступен. Он используется для проверки корректности системы защиты приложения. Его использование лучше всего показать на примере, взятом из Themida SDK.
procedure TForm1.Button4Click(Sender: TObject);
var
  StatusProtection: Integer;
begin
    {$I CheckProtection_Prolog.inc}
    asm
      push $33333333
      pop  StatusProtection
    end;
    {$I CheckProtection_Epilog.inc}
    if StatusProtection = $33333333 then
      MessageBox(0, 'Protection OK.', 'Макрос проверки защиты', MB_OK + MB_ICONINFORMATION)
    else
      MessageBox(0, 'Защита приложения нарушена!', 'Внимание!', MB_OK + MB_ICONERROR);
end;

Вы определяете число (типа Integer/Cardinal), которое макрос должен вернуть в случае, если с защитой все в порядке. В этом примере 0x33333333. При наложении защиты ассемблерные инструкции push и pop будут удалены из программы. Вместо них будет вставлена сложная процедура проверки, которая вернет в указанной переменной (в нашем примере это StatusProtection) заданное вами число, только если не обнаружит нарушений защиты. В случае обнаружения нарушения системы безопасности, число будет случайным.

Разумеется, в реальной жизни так, как показано, использовать данный макрос нельзя. Самое простое – это взять любую, использующуюся в проекте важную константу, значение которой не слишком очевидно в контексте и заменить ее на переменную. Затем использовать данный макрос на этой новой переменной где-нибудь пораньше в коде. Если защиту снимут, значение этой константы / переменной окажется некорректным, что, скорее всего, приведет к краху приложения в самых неожиданных местах.

Внутри блока макроса не должно находиться ничего, кроме указанных ассемблерных инструкций.

CheckCodeIntegrity


В демонстрационной версии Themida этот макрос недоступен. Макрос очень похож на CheckProtection, просто работает с другой частью системы защиты. Его использование абсолютно аналогично.

CheckVirtualPC


В демонстрационной версии Themida этот макрос недоступен. Макрос похож на предыдущие два, но проверяет не наличие системы защиты, а запуск защищенного приложения под гипервизором вроде VirtualPC или VMWare. Его использование абсолютно аналогично. Разве что его стоит комбинировать с соответствующей галочкой в интерфейсе программы. Тогда в защищенном приложении при обнаружении запуска под гипервизором Themida выдаст предупреждение, а если под VirtualPC попытаются запустить вариант приложения со снятой частью защиты Themida, вас выручит макрос.

Особенности защиты .NET приложений.


Несмотря на то, что Themida умеет защищать .NET приложения, нужно иметь ввиду следующее:
  • После защиты .NET приложение (*.exe) перестает быть .NET сборкой и становится обычным приложением Win32 (c сохранением, впрочем, всех своих функций, проверялось на *.exe файле Paint.NET). Загрузить приложение как сборку .NET больше не получится. Разумеется, это препятствует работе утилит вроде ILDASM.
  • Макросы внутри .NET приложений не поддерживаются.
  • IL код внутри приложения остается нетронутым, хотя и шифруется, как и все содержимое *.exe файла. Его можно подвергнуть обработке обфускатором перед защитой Themida.
  • Защита отдельных сборок в виде *.dll пока не поддерживается. Впрочем, с помощью X-Bundler сборки можно просто интегрировать в основной *.exe файл.


Небольшое интервью с Рафаэлем


  • Какова была причина прекращения разработки X-Protector и выпуска Themida?
  • Несколько причин. X-Protector имел печальную известность из-за проблем с совместимостью. Мы хотели выпустить новый продукт, лишенный этих недостатков. Кроме того, несколько изменилась команда разработчиков.
  • Каковы ваши планы на Themida64 (поддержка защиты 64-разрядных приложений)?
  • Themida для x64 будет выпущена в ближайшие месяцы, а в самое ближайшее время ее уже получат наши бета-тестеры.
  • Каковы преимущества custom-билдов Themida?
  • К сожалению, в настоящее время мы не предоставляем такой услуги, хотя у нас есть некоторые возможности для покупателей со специфическими требованиями к совместимости
  • Я видел, что в файле справки упоминаются Wine и ReactOS. Неужели, приложения, защищенные Themida, работают в этих средах?
  • Да, приложения, защищенные нашим протектором должны успешно работать в этих средах. Таковы требования большого количества наших клиентов.
  • Использует ли Themida защиту на базе ring-0?
  • Какое-то время назад первые версии Themida действительно предлагали такую защиту. Но через какое-то время мы убрали использование ring-0 для увеличения совместимости с новыми версиями Windows, реализовав вместо нее защиту на базе виртуализации кода.
  • Themida – крайне мощный протектор. Но что вы думаете о подходе, который был реализован в ExeCryptor (код там не превращался в коды для виртуальной машины, а просто мутировал и усложнялся, оставаясь нативным для процессора).
  • Я думаю, что ExeCryptor все же имел свою виртуальную машину. Опкоды, которые можно было эмулировать – эмулировали. Те, которые нельзя – мутировали в x86 вариант. Во всяком случае, это то, что я слышал, точно я не знаю.
  • Каковы ваши планы на будущее Themida?
  • Вообще мы думаем о серьезном редизайне для еще большего усиления защиты. Но прежде всего, будет выпущена поддержка x64, и все последующие версии протектора будут поддерживать как x32, так и x64 приложения.


Tags:
Hubs:
+24
Comments 119
Comments Comments 119

Articles