Что скрывают программы от отладчика?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Здорово, когда программы разрешают себя отлаживать: какие бы тайны ни скрывали, выдадут. Честным программам скрывать нечего, но встречаются и вредные: такие программы мешают себя изучать, а то и вовсе отказываются работать.

Отладчик поможет изучить зашифрованный код. Программа расшифровывает код перед выполнением: проще остановить программу отладчиком и исследовать, чем расшифровывать код самостоятельно. Программа сопротивляется отладке, когда хочет этому помешать.

Посмотрим, как справиться с противодействием отладке на примере 1337ReverseEngineer's The Junkrat https://crackmes.one/crackme/62dc0ecd33c5d44a934e9922 .

Junkrat ожидает ввода с клавиатуры и отвечает "Correct key!" на верный пароль, иначе - "Invalid password". Задача - узнать верный пароль.

Код, что проверяет пароль решает, какое сообщение показать: найдем сообщения - найдем и код. Поиск строк завершился неудачей: строки зашифрованы.

Программа отказывается работать под отладчиком: сразу завершается. Cхитрим: пока программа ожидает ввод с клавиатуры, запустим отладчик и присоединимся к процессу, а после выполним команду отладчика "Run to user code", чтобы остановиться, как только программа получит ввод.

Дизассемблируем программу и найдем вызов fgets. Автор программы нарочно запутал код: добавил лишних инструкций, из-за которых дизассемблер распознал бесполезные локальные переменные. Среди них придется отыскать те, что связаны с кодом проверки пароля.

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

Код вызывает функцию system("PAUSE") и выходит из цикла, а перед ним - проверка условия cmp. Выше - цикл: по инструкциям

mov ecx, [ebp+var_1C8]
mov dl, [ecx]
mov eax, [ebp+var_1CC]
cmp dl, [eax]

var_1C8 и var_1CC - указатели, а цикл проверяет, равны ли строки. После fgets код копирует указатель на password в переменную var_1C8, а в var_1CC - секретный пароль.

Снова запускаем программу, стыкуем отладчик и ставим breakpoint на начало цикла проверки пароля, вводим пароль, возвращаемся в отладчик и получаем секретный пароль по адресу [ebp-1CC].

Послесловие

Код полон вызовов IsDebuggerPresent и GetTickCount, чтобы замерять время между инструкциями, однако между чтением пароля и проверкой программа оказалась не защищена. Задача окажется сложнее, если зашифровать и код.

Отладчики умеют скрываться при помощи плагинов, например, ScyllaHide https://github.com/x64dbg/ScyllaHide/releases/ .

Источник: https://habr.com/ru/post/713446/


Интересные статьи

Интересные статьи

Современные компиляторы весьма далеко продвинулись в области оптимизации ПО. Но иногда им бывает трудно подобрать наилучший способ оптимизации. К счастью, мы можем помочь им в этом выборе. Под катом ...
Настройка любой площадки для CMS — это рутинный процесс, который должен быть доведен до автоматизма в каждой уважающей себя компании. А потому частенько воспринимается, как восход солнца — это происхо...
Многие компании в определенный момент приходят к тому, что ряд процессов в бизнесе нужно автоматизировать, чтобы не потерять свое место под солнцем и своих заказчиков. Поэтому все...
Про сборку компьютера, на мой взгляд, много писать нет смысла, обычно хватает слов «собрал компьютер», не обязательно часовое видео на ютуб заливать. Но с ретроПК сборка сама по себе ...
Cтатья будет полезна тем, кто думает какую выбрать CMS для интернет-магазина, сравнивает различные движки, ищет в них плюсы и минусы важные для себя.