Obsidium

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Obsidium - программа для обеспечения защиты программного обеспечения и операционных систем от несанкционированной модификации (взлома), а также создания безопасных систем лицензирования и регистрации.

Содержание

Основные возможности

  • защита программного кода;
  • сжатие программного кода;
  • автоматизация генерирования лицензий;
  • защита всех видов ресурсов программы;
  • возможность использования ключей, сопоставимым по стойкости до 2048 разрядных;
  • создание черного списка недействующих ключей;
  • шифрование системы лицензий;
  • регистрация через файл-ключ или текстовой ключ;
  • создание ограниченных по времени версий программ (trial версий);
  • поддержка защиты dll.
  • поддержка 64-битных ОС.

История развития

Obsidium 1.0.0.69 первая версия, которая была доступна широкому кругу лиц. Уже тогда Obsidium поддерживал антиотладочные приемы, защиту оригинальной точки входа, мусорные команды и систему лицензирования. Позже с версии 1.4.0.0 в протектор добавилась, пожалуй самая мощная опция защиты под названием Code Virtualization. На 1 января 2011 года последней версией протектора является 1.4.4.11.

Антиотладка

Obsidium использует достаточно интересные анти-отладочные трюки, в числе которых:

IsDebuggerPresent

API-функция IsDebuggerPresent показывает, находится ли процесс, который её вызывает, в контексте отладчика, то есть отлаживается ли он.Эта функция экспортируется из KERNEL32.dll, и если программа находится под отладкой, то возвращаемое значение равно единице, а если нет, то нулю.

FindWindowA

Находит pодительское окно веpхнего уpовня с совпадающими ClassName и WindowName. Не осуществляет поиск дочеpних окон

CheckRemoteDebuggerPresent

BOOL CheckRemoteDebuggerPresent(
HANDLE hProcess,
PBOOL pbDebuggerPresent)

Эта функция, в принципе, аналогична IsDebuggerPresent, но только по возвращаемым результатам. А ее начинка не похожа на IsDebuggerPresent совсем. Она, как видно, может проверять и другой процесс на наличие отладки, и способ проверки отличается от простого просмотра байта в PEB. Впервые она появилась в Windows XP SP1, поэтому ее использование не универсально. Функцию CheckRemoteDebuggerPresent можно, как обычно, перехватывать, а возвращаемые ею значения – подменять.

UnhandledExceptionFilter

Если процесс не отлаживают, то на финальном исключении (не обработанном SEH), которое намеренно делает протектор (к примеру деление на ноль), управление переходит на установленный с помощью SetUnhandledExceptionFilter обработчик, после которого программа спокойно продолжает выполнять свои действия. Если же это происходит во время отладки, то управление передастся не на финальный обработчик, а отладчику, и программа падает, так как отладчик не знает, что делать.

Проверка установленных брекпоинтов

Obsidium проводит проверку наличия CC в первом байте абсолютно любой апи (непосредственно перед вызовом). Огородить себя от данной анти-отладки можно очень просто: не устанавливать брекпоинты на начало вызова WINAPI Пример

7C80AE40 >  8BFF            MOV EDI,EDI
7C80AE42    55              PUSH EBP
7C80AE43    8BEC            MOV EBP,ESP <------ставим брекпоинт например сюда
7C80AE45    51              PUSH ECX
7C80AE46    51              PUSH ECX
7C80AE47    53              PUSH EBX
7C80AE48    57              PUSH EDI
7C80AE49    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]
7C80AE4C    BB FFFF0000     MOV EBX,0FFFF
7C80AE51    3BFB            CMP EDI,EBX

Использование исключений и SEH

Протектор очень активно использует команды приводящие к исключениям (DIV, int3 и т.д).Хоть это и не является очень сильным препятствим, но всё-таки мешает отладке программы. Также Obsidum для очистки аппартных брекпоинтов использует SEH

Потоки

Obsidum создаёт один или два дополнительных потока (Threads), которые в некоторых случаях для нормальной отладки приходиться "убивать".

Антидамп

Защита Оригинальной точки входа (OEP)

Кража OEP не является "фишкой" протектора. Крадёт он байт не много, а в некоторых программах (написанных, например на Borland C++) их даже не нужно восстанавливать. В первых версиях протектора краденные с OEP байты отрабатывались в выделенной памяти, что немного затрудняло распаковку программы.

Защита таблицы импорта

Защита таблицы импорта в Obsidium довольно серьёзная вещь. Протектор умеет получать имена API четырьмя способами (через четыре переходника):

CMP EAX,4   <------- 1 способ получения апи
JE 00395522
CMP EAX,1   <------- 2 способ получения апи
JE SHORT 003954F8
CMP EAX,80  <------- 3 способ получения апи
JE 00395754
CMP EAX,40  <------- 4 способ получения апи
JE 0039554E

Также протектор активно эмулирует некоторые Windows API (например GetCommandLine, GetVersion, GetCurrentProcessID и т.д), отрабатывает первые команды функций в своём защищённом коде и имеет свои собственные апи.


Runtime Patching

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

Code Virtualization

Опция защиты протектора, которая появилась в версии 1.4. Это своеобразная виртуальная машина которая отрабатывает защищённый код,который для полной распаковки программы приходится восстанавливать. Code Virtualization значительно снижает скорость работы приложения, поэтому данную защиту необходимо применять только в местах особенно критичных для взлома (например, проверка регистрации).

Другие опции

  • Шифрование ресурсов
  • Проверка запуска на виртуальных машинах
  • Случайные имена секций
  • Создание ознакомительных версий программ

Доступные модели лицензирования

При использовании Obsidium для защиты приложения можно воспользоваться одной из встроенных в систему лицензирования моделью или придерживаться своей собственной системы регистрации.

Внутренняя система протектора

Obsidium предоставляет две надежные и простые в реализации системы лицензирования на основе сильной криптографии с открытым ключом (например, различные ключи используются для шифрования и дешифрования данных лицензирования, что делает практически невозможным создание поддельных ключей лицензии).

  • Длинные ключи
Тип шифрования                                RSA
Длина ключа в битах                           512, 768, 1024, 1536, 2048
Длина лицензионного ключа                     от 256 до 312 байт
Информация, которая хранится в ключах         4 строки текста
Пример ключа                                  3ayaXIs8S/A2wbB0baOT/iwlYwk0GgJ8yAl5FZM
                                              oWW5plZCHGnUCt6PKQ+9Kca8N3ayaXIs8S/A2wbB
                                              0baOT/iwlYwk0GgJ8yAl5FZMoWW5plZCHGnUCt6PKQ
                                              +9Kca8Nz86rjgcTvOZjOInOmXGyPyW4DtQQ9gW2Jd
                                              DxsslXmTJzGSf5GNo7mL2DIKbqGJNcB6duOE8lH77
                                              LW0N8T/AiFSkWG9h8wJ2IejAFmJXiFdivQ4U9UnNFtCl
                                              EHnPc2IydXPLzHZJGOtlg8m+xGcKjqSraGaQaaNvoDGBfWS2f+
                                              mTUYjOwg+8utPElkBMP5a9etO7TgGljrD=
  • Короткие ключи
Тип шифрования                                Elliptic Curve Cryptography
Длина ключа в битах                           113, 131, 163
Длина лицензионного ключа                     от 36 до 60 символов
Информация, которая хранится в ключах         1 текстовая строка, 16 бит двоичного 
                                              значения (расширенные ключи) 
Пример ключа                                  NJ50V-QWW9M-61F7H-3XVC3-FCPUI-MF425-V8QL5-USD2W-I4F

Внешняя система, созданная программистом

Программист может сам создать стойкий алгоритм и с помощю API протектора setExternalKey использовать его при защите своей программы.

Сохранение лицензии при регистрации программы

Obsidum при регистрации программы позволяет сохранять информацию в следующих местах:

  • Ключевом файле

Ключевой файл может иметь любое имя (по умолчанию key.dat), может находиться в папке с программой, в папке Документы пользователя или в папке Общие документы.

  • Реестре

Автоматические распаковщики

На данный момент в сети не возможно найти ни один автоматический распаковщик к этому протектору. Радует только то, что к старым версиям протектора можно найти скрипты к OllyDbg для "полу-автомотической" распаковки.

Что почитать?

Распаковка Obsidium 1.2.5.0 (Haggar)

Распаковка Obsidium 1.3.4.2 (Solid)

Знаете ли Вы, что...

  • Защита .NET приложений (VB .NET, C#, Delphi 8 .NET etc.) не поддерживается этим протектором.
  • Протектор имеет около 22 API функций для взаимодействия Вашего приложения со своей защитой.
  • Obsidum поддерживает работу с коммандной строкой

Ссылки

Obsidium Home Page

Crackme Obsidium

См. также

Протектор

Упаковщик

Распаковка

ACProtect

Armadillo

ASProtect

Code Virtualizer

Enigma

Themida/WinLicense

VMProtect

Источник — «https://exelab.ru/faq/Obsidium»