Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Крэкинг с помощью OllyDbg




Лабораторная работа


Первым делом запускаем наш отладчик OllyDbg , при первом запуске он попросит вас указать пути к UDD и Plugins, поможем ему заходим в Options->Appearance->Directories и прописываем оба пути( просто укажите папку где лежит OllyDbg). Непугайтесь множества окон, для работы нам понадобиться всего 3.

1.CPU
2.Breakpoints
3.Patches

Все остальные окна рекомендую закрыть, чтоб они нам не мешали.
1.Открываем нашу программу в отладчике. Для этого открываем меню File->Open и выбираем нашу тестовую программу. После загрузки в окне CPU мы увидим вот такую картину.

Это и есть ассемблерный код нашей программы.
Теперь немного объясню некоторые строчки:
PUSH EBP ; Начало другой функции
CALL TestP.00405С60 ; Вызов функции
Этого пока нам будет достаточно.

 

2.Теперь нам надо найти функцию которая выдает окно с запросом ввода ключа. Для этого выполняем программу пошагово нажимая клавишу F8 до тех пор пока не появиться окошко с запросом ввода. После нескольких нажатий появляется окошко ввода.

 

Теперь мы знаем что где-то в этой функции (TestP.004523B8) выводиться наше окошко. Нам необходимо докопаться до функции которая выводить окно, для этого надо зайти в эту функцию.

Теперь перед этой строкой CALL TestP.004523B8 нам надо поставить точку останова (Breakpoint) для этого выделяем строку перед ней и нажимаем F2 и видим что в окошко Breakpoints добавилась эта строка.

 

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

 

Нам надо продолжать пока не найдем функцию которая выводит окно и обрабатывает нажатие на кнопку ОК и определяет правильно мы ввели ключ или нет. Продолжим, также нажимаем F8 пока не появиться окно.

 

Опять перед ней ставим точку останова.

 

Продолжаем дальше, находим очередную функцию

 

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

 

Продолжаем искать нажимая F8. Походу нажатия F8 мы видим что начинают появляться API функции,

 

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

 

 

но при нажатии на него мышкой окно не появляется, уряя значит мы там где нам нужно, именно эта функция рисует окно и где-то тут сверяется введенный нами ключ. Продолжаем дальше трассировать программу (F8!) и видим что на этом месте

 

какой-то цикл, который постоянно повторяется, у нас уже палец болит держать F8 , а он никак не кончиться, для этого ставим точку останова на первой строке после цикла (MOV DWORD PTR SS:[EBP-8],EAX)

 

Окошко закрылось и мы вернулись в окно отладчика, выполнение остановилось на нашей точке останова. Теперь нам надо найти функцию в которой выводит окошко с уведомление что ключ введен неверно. Для этого трассируем (F8) нашу программу до того момента пока не появится окошко с уведомлением.

 

Тут мы и будем разбираться что к чему. В глаза первым делом кидается строчка это и есть наш правильный ключ, но не надейтесь что в других программах вы так просто его найдете, обычно ключи просто так в памяти не лежат, потому нашей задачей будет сделать так чтоб программа принимала любой ключ! Теперь проанализируем код перед вызовом функции (CALL TestP.00427294) которая выводит окно с уведомлением об ошибке. Первым делом смотрим в окно регистров которое находиться в окне

 

И видим что в регистре EAX лежит адрес введенного нами ключа в памяти и соответственно что мы ввели (я ввел 23). Тут все уже немного сложнее и надо иметь хоть небольшие знание основных операторов ассемблера. Думаем так, что программа должна сравнить наш ключ с каким либо еще или проверить его правильность любым другим способом, но для этого она должна вызвать функцию которая это все сделает. Значит ищем приблизительно такую структуру

MOV EAX, ... //записывает в EAX адрес нашей строки
...................
CALL ... //вызов функции которая проверит правильность нашей функции
JNZ(или JE) ...// условный переход (почитайте о них!)

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

MOV EAX,DWORD PTR SS:[EBP-4]
MOV EDX,TestP.00453BA4
CALL TestP.00404258
JE SHORT TestP.00453B4A

 

Теперь заново пошагово выполните это кусочек кода и вы увидите что этот оператор
JE SHORT TestP.00453B4A пропускается и никуда нас не перекидывает, значит это и есть наша функция которая проверила наш код и он оказался неверным потому оператор JE никуда нас и неперекинул. Я нибуду вам обьяснять как этот оператор проверяет правильность, мы все делаем "жестко" напролом :). Значит если код будет введен то этот оператор кинет нас по одресу 00453B4A и все будет ок :). Заменяем этот оператор на безусловный переход (JMP) который в любом случае перекинет нас по этому адресу. Посмотрите где этот адрес находиться (выделенная строка синим цветом).

 

Видим что вызов функции которая выводит уведомление о том что ключ неверен, пропускается.
Для того чтоб заменить строку выделяем её и нажимаем пробел(Space) и заменяем это

 

 


Видим что строка JE SHORT TestP.00453B4C заменилась и в окошке Patches добавилась строка.

 

 

Теперь проверяем или работает. Нажимаем кнопочку , в окне Breakpoints нажимаем правой клавишей мышки и в меню выбираем Disable All. Далее в окне Patches на нашей строке нажимаем правой и в меню выбираем Apply Patch. После этого жмем кнопку , выводиться окошко с запросом ключа, вводим любой ключ, нажимаем ок и наша программа зарегистрирована. Конкретно эта программа будет всегда спрашивать ключ, так как это просто тест, а реальная программа записала бы себе что вы правильно ввели ключ.
Приметка! Тут удалось сразу найти нужный нам кусочек кода, но не всегда все будет так просто. Иногда придется пробовать по очереди все структуры такого типа.

3.Последний шаг, надо зашить патч в программу для этого нам и нужен Hex редактор.


Поделиться:

Дата добавления: 2015-04-15; просмотров: 114; Мы поможем в написании вашей работы!; Нарушение авторских прав


<== предыдущая лекция | следующая лекция ==>
Консистенция и другие показатели, воспринимаемые органами осязания | 
lektsii.com - Лекции.Ком - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты