КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
Александр Панов. Реверсинг и зашита программ от взлома.
С зашифрованием сообщений
Файлы к статье: CrakMe-2, плагин GODUP.
В предыдущем уроке выяснилось, что ничего сложного в таких программах нет. Все у нас получилось, и мы даже не заметили, как быстро нашли пароль. Теперь давайте посмотрим, что получится, если строки зашифрованы.
Мы попробуем подобрать пароль к nporpaмме CRAKME-2.EXE. Итак, начинаем. Запускаем программу.
Мы видим практически такое же окно. Пробуем ввести любой номер.
Получаем окно с сообщением о неверном пароле.
Как видите, пока все точно так же, как и в первом случае.
Давайте посмотрим, запакована программа или нет. Запускаем программу PEiD, загружаем в него нашу исследуемую программу.
Так, смотрим: программа тоже не запакована и не зашифрована. Ну, что же, очень хорошо. Запускаем отладчик OllyDbg и загружаем нашу программу в него.
Как видим, пока отличий нет. Все повторяется в точности, как и с программой СгакМе-1. Попробуем найти строки текста, как я описал это ранее.
Что же мы видим?
Текста нет! Это значит, что программист, создававший программу, постарался защитить ее от изменения (например, с помощью редактора ресурсов).
Как же быть? Можно, конечно, потихоньку трассировать всю программу, но так мы точно ничего не добъемся, поскольку программа может быть очень большой. Чтобы облегчить себе жизнь и не гадать, что за функция скрывается например под именем СrаkМе-2.00445BA38 мы сделаем следующее: запустим дизассемблер IDA.
Откроем в нем исследуемый файл CRAKME-2.EXE и подождем, пока IDA проанализирует наш файл.
После итого выберем команду File > Produce file > Create MAP file.
и сохраним МAР-файл в той же папке, где находится файл CRAKME-2.EXE. Закрываем окно IDA — oн нам больше не понадобится.
После этого в окне отладчика OllyDbg выберем команду Plugins > GODUP Plugins > Map Loader > Load labels > Наш МАР-файл.
Наши функции сpaзy преобразились.
Читать функции стало намного приятнее. Но вот для того, чтобы найти в программе заветный пароль, надо "сказать" OllyDbg, чтобы он прервал выполнение исследуемой нами программы в момент ввода пароля или его анализа. Что для итого потребуется? Надо поставить брекпойит. Но на какую функцию его поставить? Вот для того чтобы узнать, какие функции можно использовать, мы и запускали программу PEiD. Эта программа показала, что наша программа написана на Borland C++ 1999, значит, мы можем использовать все функции из итого компилятора.
Список всех используемых программой функций можно вывести так:
Так, теперь нам нужны функции работы со строками. Почему именно они? Дело в том, что раз мы вводим пароль в виде строки, то скорее всего и проверять его программа будет с помощью функций для работы со строками. А вот чтобы узнать эти функции, вам и пригодится знание языка программирования высокого уровня.
Выбираем экспортируемые программой функции для работы со строками.
Например, давайте попробуем поставить брекпойнт на функцию lstrcpyA и посмотреть, что получится.
Брекпойнт поставлен, но при запуске программы мы в OllyDbg не попадаем. Это значит, что мы поставили брекпойнт не на ту функцию. Давайте подумаем и внимательно посмотрим па программу. Если запустить CrakMe-2 и ввести любой пароли то при нажатии кнопки ОК мы получаем окно. Вам не кажется, что это окно похоже па результат вызова обычной функции MessageBox? Попробуем поставить брекпойнт на MessageBoxA.
Поставили? Нажимаем в OllyDbg клавишу <F9>. Запустилась паша программа.
Введем в окне любые символы (я ввел "12345") и нажимаем кнопку ОК.
В окне кода остановились на первой инструкции функции MessageBoxA.
В окне стека видим адрес возврата из функции MessageBoxA и параметры передаваемые в функцию.
Адрес возврата указывает на 401E1A. Давайте посмотрим, что за код находится по этому адресу. Для этого правый щелчек в верхней ячейке стека - Follow in Disassembler.
Что же мы видим? Над двумя MessageBoxA видим интересную строку.
На что это похоже? На первый взгляд, функция сравнивает две строки текста. А зачем программа что-то сравнивает? Правильно! Она берет введенную нами строку и сравнивает ее с зашифрованной в программе. Если есть совпадение, значит, появится сообщение о том, что пароль верный, а если нет — о том, что неверный. Установим брекпойнт по адресу 00401DC6 и перезапустим программу. Вводим в окне программы символы пароля и попадаем на наш брекпойнт.
Теперь, чтобы посмотреть, что же там сравнивает программа, нам необходимо зайти в эту функцию. Для этого трассируем программу с помощью клавиши <F7>.
Вот мы "попали" внутрь функции сравнения. Доходим до этого места.
Что же мы видим в регистрах ЕAХ и EDX?
В ЕAХ — введенные нами символы, а в EDX — символы, с которыми сравниваются наши. Вывод: символы из регистра EDX и есть правильный пароль. Проверим это, введя их в окне нашей программы CrakMe-2. Вот мы и получили сообщение, которое видим.
Вот и все! Как видите, шифрование сообщений сильно усложняет жизнь взломщику. Хсля это и не даст 100%-ой гарантии от взлома вашей программы, но большинство начинающих взломщиков остановит.
![]() |
Примечание Чтобы еще больше усложнить жизнь взломщику, запомните правило: никогда не выводите сообщение СРАЗУ после проверки пароля на правильность. Это все равно, что указать взломщику, что вот тут у вас пароль. |