УРОКИ ПО КРЕКИНГУ

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Контакты]

Реверсинг и защита программ от взлома - Урок 2 [Александр Панов]


Александр Панов. Реверсинг и зашита программ от взлома.

С зашифрованием сообщений

Файлы к статье: CrakMe-2, плагин GODUP.

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

Мы попробуем подобрать пароль к nporpaмме CRAKME-2.EXE. Итак, начинаем. Запускаем программу.

2-1

Мы видим практически такое же окно. Пробуем ввести любой номер.

2-2

 Получаем окно с сообщением о неверном пароле.

2-3

Как видите, пока все точно так же, как и в первом случае.

Давайте посмотрим, запакована программа или нет. Запускаем программу PEiD, загружаем в него нашу исследуемую программу.

2-4

Так, смотрим: программа тоже не запакована и не зашифрована. Ну, что же, очень хорошо. Запускаем отладчик OllyDbg и загружаем нашу программу в него.

2-5

Как видим, пока отличий нет. Все повторяется в точности, как и с программой СгакМе-1. Попробуем найти строки текста, как я описал это ранее.

2-6

Что же мы видим?

2-7

Текста нет! Это значит, что программист, создававший программу, постарался защитить ее от изменения (например, с помощью редактора ресурсов).

Как же быть? Можно, конечно, потихоньку трассировать всю программу, но так мы точно ничего не добъемся, поскольку программа может быть очень большой. Чтобы облегчить себе жизнь и не гадать, что за функция скрывается например под именем СrаkМе-2.00445BA38 мы сделаем следующее: запустим дизассемблер IDA.

2-8

2-9

2-10

2-11

 Откроем в нем исследуемый файл CRAKME-2.EXE и подождем, пока IDA проанализирует наш файл.

После итого выберем команду File > Produce file > Create MAP file.

2-12

2-13

 и сохраним МAР-файл в той же папке, где находится файл CRAKME-2.EXE. Закрываем окно IDA — oн нам больше не понадобится.

После этого в окне отладчика OllyDbg выберем команду Plugins > GODUP Plugins > Map Loader > Load labels > Наш МАР-файл.

2-14

Наши функции сpaзy преобразились.

2-15

Читать функции стало намного приятнее. Но вот для того, чтобы найти в программе заветный пароль, надо "сказать" OllyDbg, чтобы он прервал выполнение исследуемой нами программы в момент ввода пароля или его анализа. Что для итого потребуется? Надо поставить брекпойит. Но на какую функцию его поставить? Вот для того чтобы узнать, какие функции можно использовать, мы и запускали программу PEiD. Эта программа показала, что наша программа написана на Borland C++ 1999, значит, мы можем использовать все функции из итого компилятора.

Список всех используемых программой функций можно вывести так:

2-16

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

Выбираем экспортируемые программой функции для работы со строками.

2-17

Например, давайте попробуем поставить брекпойнт на функцию lstrcpyA и посмотреть, что получится.

2-18

Брекпойнт поставлен, но при запуске программы мы в OllyDbg не попадаем. Это значит, что мы поставили брекпойнт не на ту функцию. Давайте подумаем и внимательно посмотрим па программу. Если запустить CrakMe-2 и ввести любой пароли то при нажатии кнопки ОК мы получаем окно. Вам не кажется, что это окно похоже па результат вызова обычной функции MessageBox? Попробуем поставить брекпойнт на MessageBoxA.

2-19

Поставили? Нажимаем в OllyDbg клавишу <F9>. Запустилась паша программа.

2-2

Введем в окне любые символы (я ввел "12345") и нажимаем кнопку ОК.

2-20

В окне кода остановились на первой инструкции функции MessageBoxA.

2-21

В окне стека видим адрес возврата из функции MessageBoxA и параметры передаваемые в функцию.

Адрес возврата указывает на 401E1A. Давайте посмотрим, что за код находится по этому адресу. Для этого правый щелчек в верхней ячейке стека - Follow in Disassembler.

2-22

Что же мы видим? Над двумя MessageBoxA видим интересную строку.

2-23

На что это похоже? На первый взгляд, функция сравнивает две строки текста. А зачем программа что-то сравнивает? Правильно! Она берет введенную нами строку и сравнивает ее с зашифрованной в программе. Если есть совпадение, значит, появится сообщение о том, что пароль верный, а если нет — о том, что неверный. Установим брекпойнт по адресу 00401DC6 и  перезапустим программу. Вводим в окне программы символы пароля и попадаем на наш брекпойнт.

2-24

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

2-25

Вот мы "попали" внутрь функции сравнения. Доходим до этого места.

2-26

Что же мы видим в регистрах ЕAХ и EDX?

2-27

В ЕAХ — введенные нами символы, а в EDX — символы, с которыми сравниваются наши. Вывод: символы из регистра EDX и есть правильный пароль. Проверим это, введя их в окне нашей программы CrakMe-2. Вот мы и получили сообщение, которое видим.

2-28

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

Примечание

Чтобы еще больше усложнить жизнь взломщику, запомните правило: никогда не выводите сообщение СРАЗУ после проверки пароля на правильность. Это все равно, что указать взломщику, что вот тут у вас пароль.