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

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

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

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


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

 Файлы к статье

Запускаем программу CrackMe-1.exe. Мы видим окно с текстовым полем, в котором надо ввести пароль. Давайте попробуем что-нибудь ввести и нажать кнопку ОК. Я ввел цифры "12345" и нажал кнопку ОК. В результате получено сообщение о том, что пароль неверный.

pan1-1    1-1

Перед реверсингом программы мы должны узнать о программе как можно больше. Самое первое, что мы должны у знать, это (именно в таком порядке!):

  1.  Зашифрована программа или нет.
  2. На каком языке она написана. Это очень важно, т. к. для того, чтобы поставить точки останова (брекпойнты) в отладчике, мы должны знать, на какие собственно функции их ставить. У каждого языка программирования они свои. Например, у Visual C++ или API они одни, а у Delphi или Builder C++ (компиляторов фирмы Borland) совсем другие (я уже не говорю о Visual Basic!).

Давайте займемся нашим "узнаванием". Для реализации первого пункта запускаем утилизу PEiD (или, полностью, РЕ iDenliller v0.95 by snaker, Qweilon & Jibz). При запуске этой утилиты появляется окно.

1-3

Нажимаем кнопку, расположенную справа от ноля File, находим и открываем наш файл CRAKME-1.EXE (можно просто перетащить наш файл CRAKME-1.EXE в окно PEiD c помощью мыши.) Программа PEiD проанализирует файл и выведет информацию о нем в своем окне.

1-4

Как мы видим, в нижней строке нам написали "Borland C++ 1999". Это значит, что исследуемая программа написана на языке программирования C++ фирмы Borland и ничем не зашифрована и не запакована (имеются в виду шифровальщики, или протекторы, и паковщики сторонних разработчиков, такие как UPS, ASP Pack и т. д.).

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

Итак, раз программа ничем не запакована, то мы можем смело запускать отладчик и загружать программу в него. Отладчик лучше всего развернуть на полный экран.

1-1-1

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

Первое, что может прийти в голову, это постараться найти в теле программы строки, которые она выводит па экран (например, "password FALSE"). Большинство программистов не шифрует выводимые данные в программе, а раз так, этим можно воспользоваться.

Поэтому давайте выполним поиск всех текстовых строк в файле. Для этого мы в главном окне (окне кода) нажимаем правую кнопку мыши и выбираем в контекстном меню команд: Search for > All referenced text strings.

1-5

 Отладчик выдаст нам все найденные текстовые строки.

1-6

Сообщение о неправильном пароле не зашифровано. Нам очень повезло — попался ленивый программист. Двойной щелчок мышкой на строчку password FALSE в отладчике и попадаем на код, срабатывающий в том случае, если введенный пароль не верен.

1-7

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

1-8

Обратите внимание на стрелочки, которые находятся левее кода инструкции. Эти стрелки показывают направление перехода. То есть откуда или куда происходит переход после срабатывания логики в программе.

Если нажать мышкой на эту стрелочку (или просто выделить строку рядом со стрелкой), то мы наглядно увидим данный переход. Давайте выделим мышкой строку.

1-9

Мы видим, что переход на наше сообщение о неверном пароле осуществляется с адреса 00401C558. Как вы знаете, в ассемблере функция je осуществляет условный переход. Исходя из этого, сделаем вывод, что некая функция проверяет наш пароль на правильность и, если он верен, переходит на строку по адресу 00401С77, а если не верен, то на строку по адресу 00401C5A.

Таким образом, получается, что функция проверки правильности пароля находится выше строки:

1-10

Давайте пролистаем окно кода отладчика немного вверх, вот до таких строк:

1-11

Как вы знаете, функция ассемблера CMP выполняет сравнение. А после сравнения сразу стоит переход:

1-12

Давайте поставим брекпойпт на CMP. Для этого нужно выделить строку с помощью мыши и нажать клавишу F2. Адрес окрасится красным цветом.

1-13

Теперь запустим программу в отладчике. Для этого нажмем клавишу F9. Наша программа запустилась, но в отладчик не попала. Что это значит? Это значит, что пока код, где мы поставили точку останова (брекпойпт), не выполнялся. Давайте введем любой пароль в окне программы CRAKME-1.EXE и нажмем кнопку ОК.

1-14

 Вот! Мы попали в отладчик.

1-15

1-16

Теперь давайте будем трассировать программу с помощью клавиши F8, вот до этого момента

1-17

И что же мы видим в окне регистров? А, точнее, в регистре EAX?

1-18

Мы видим наш заветный пароль: S4K6n37fE.

Давайте попробуем ввести его в окне исследуемой нами программы.

1-19

Мы получим сообщение.

1-20

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