Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

5 Методов антиотладки, которые защитят ваше программное обеспечение

9 апреля 2016 г. Archy Просмотров: 2495 RSS Обсудить
Общие вопросы

5 Методов антиотладки

Публикуя программное обеспечение, мы привыкли писать в лицензионных соглашениях: «Обратная разработка, декомпиляция или дизассемблирование программы запрещено». Но во многих ситуациях подобные слова являются не лучшей защитой и требуется применение технических средств, обеспечивающих предотвращение инвертирования программного обеспечения и позволяющих защитить свои инновации от использования конкурентами.

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

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

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

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

1. Встроенные функции для проверки присутствия отладчика

Операционная система Windows предлагает несколько готовых к использованию инструментов для создания простой защиты от отладки. Простейшая техника антиотладки включает в себя вызов функции IsDebuggerPresent. Эта функция возвращает TRUE, если отладчик занимается отладкой процесса в пользовательском режиме.

Эта функция ссылается на блок операционного окружения процесса или PEB (Process Environment Block), в частности, на его поле BeingDebugged. Используя этот факт, можно обойти такую защиту, например, применив инъекцию DLL для того, чтобы установить значение BeingDebugged равным 0 перед моментом проведения проверки.

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

Другой вариант проверки – использование CheckRemoteDebuggerPresent. В отличие от описанной выше функции, здесь проверяется, существует ли процесс, параллельный текущему процессу отладки. Проверка основана на функции NtQueryInformationProcess, в частности на значении ProcessDebugPort.

2. Скрытие потоков

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

Начиная с Windows 2000, функция NtSetInformationThread получила новый флаг ThreadHideFromDebugger. Это чрезвычайно эффективный метод антиотладки, входящий в операционную систему Windows OS. Поток, для которого установлен этот флаг, прекращает отправлять уведомления процесса отладки, в частности, о точках останова, тем самым пряча себя от любого отладчика. Использование ThreadHideFromDebugger для главного потока значительно усложнит процесс прикрепления отладчика к процессу.

Windows Vista предлагает логическое продолжение этой идеи в виде функции NtCreateThreadEx. Она имеет параметр CreateFlags, позволяющий среди прочего устанавливать флаг THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER. Процесс с этим флагом будет скрыт от отладчика.

3. Проверка флагов

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

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

Исполняемый файл может сбрасывать флаги NtGlobalFlag структуры PEB с помощью специальной структуры под названием IMAGE_LOAD_CONFIG_DIRECTORY, содержащей особую конфигурацию параметров для загрузки системы. Она имеет поле GlobalFlagsClear, которое сбрасывает флаг NtGlobalFlag. По умолчанию, эта структура не добавляется в исполняемый файл, но может быть добавлена позже. Тот факт, что исполняемый файл не содержит эту структуру, или значение GlobalFlagsClear равно нулю, в то время, как соответствующее поле на диске или у процесса в памяти не равны нулю, указывает на наличие скрытого отладчика. Эта проверка может быть имплементирована в исполняемом коде.

Другая группа флагов принадлежит «куче» процесса. Существует два поля соответствующей структуры _HEAP: Flags и ForceFlags. Оба меняют свое значение, когда происходит отладка соответствующего процесса и, таким образом, могут служить основой для проверки и защиты от отладки.

Еще одна проверка флага, которую можно использовать для обнаружения отладчика, это проверка Trap Flag (TF). Она находится в реестре EFLAGS. Когда TF равен 1, процессор генерирует INT 01h («одношаговое» исключение) после каждого выполнения инструкции, поддерживая процесс отладки.

4. Обнаружение точек останова

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

Существует два вида точек останова: программные и аппаратные.

Программные точки останова устанавливаются отладчиком путем инъекции инструкции int 3h в код. Таким образом, методы обнаружения отладчика основаны на вычислении контрольной суммы соответствующей функции.

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

Аппаратные точки останова устанавливаются, используя специальные регистры отладки: DR0-DR7. Используя их, разработчик может прервать выполнение программы и передать управление отладчику. Защита от отладчика может быть построена на проверке значений этих регистров или использовать более активный подход и принудительно сбрасывать их значения, используя функцию SetThreadContext, чтобы предотвратить отладку.

5. Обработка исключений: SEH

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

При отладке приложения отладчик должен перехватывать контроль после генерации int 3h, иначе контроль будет передан SEH обработчику. Это можно использоваться для организации защиты от отладки: можно создать собственный SEH обработчик и поставить его в начало стека, а затем сгенерировать int 3h. Если наш обработчик получит контроль, отладчик в данный момент не работает, в противном случае можно принимать меры против отладки – мы обнаружили отладчик.

Заключение

Мы кратко описали лишь малую часть многочисленных антиотладочных методов

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

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

 

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

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

(обязательно)