Антиреверсивные методы (Часть 2)
В первой части мы обсудили некоторые распространенные методы, используемые авторами вредоносных программ для защиты своих приложений от реверс-инжиниринга. Во второй части мы рассмотрим другие методы и приемы, используемые для обнаружения и предотвращения реверс-инжиниринга.
Обнаружение отладчика:
Техника синхронизации выполнения кода:
При использовании отладчика для анализа исполняемого файла иногда мы используем одношаговое выполнение для прохождения некоторых инструкций сборки, время выполнения будет намного больше, чем обычное выполнение, давайте возьмем этот код для примера:

В начале кода у нас есть вызов функции « GetTickCount », которая возвращает количество миллисекунд, прошедших с момента запуска системы. Код до выполнения функции « ShellExecuteW » займет от 30 до 47 миллисекунд, как я измерял на своей машине. После этого мы снова вызываем функцию « GetTickCount », чтобы получить время, а затем получить разницу между двумя значениями вызовов, и если она превышает 70 миллисекунд, выходим из процесса, в противном случае печатаем сообщение.
Существуют и другие API-интерфейсы Windows, которые можно использовать для получения времени, например:
- ПолучитьМестноеВремя().
- ПолучитьСистемноеВремя().
- Счетчик производительности запроса().
Программные точки останова — это распространенный метод предотвращения отладки, используемый злоумышленниками, чтобы затруднить реконструирование своих вредоносных программ. Этот метод включает вставку определенной инструкции кода, известной как точка останова, в программу в определенном месте. Когда программа выполняется, точка останова приводит к остановке программы, что затрудняет анализ поведения программы отладчиком.
Одним из способов реализации точки останова с помощью языка ассемблера является использование int 3
инструкции. Эта инструкция представляет собой программное прерывание, которое приводит к остановке выполнения программы и передаче управления отладчику. Вот пример того, как использовать int 3
инструкцию на C++:

Аппаратные точки останова:
Аппаратные точки останова — это метод предотвращения отладки, который использует специальные аппаратные функции ЦП для обнаружения и предотвращения отладки программы. Этот метод включает в себя установку точки останова на определенном адресе памяти или регистре, а затем указание ЦП запускать прерывание всякий раз, когда программа получает доступ или изменяет указанный адрес или регистр.
Ниже приведен пример того, как проверить, установлена ли аппаратная точка останова:

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


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

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