Главная страница
Навигация по странице:

  • "Урок крэкинга с помощью OllyDbg"

  • Приступим!, для начала качаем весь необходимый софт. 1.

  • 74 2B

  • Урок крэкинга с помощью OllyDbg. Статья приведена исключительно в информационноознакомительных целях. Коллектив проекта "daxa" не несет никакой ответственности


    Скачать 227.31 Kb.
    НазваниеСтатья приведена исключительно в информационноознакомительных целях. Коллектив проекта "daxa" не несет никакой ответственности
    АнкорУрок крэкинга с помощью OllyDbg.docx
    Дата02.10.2018
    Размер227.31 Kb.
    Формат файлаdocx
    Имя файлаУрок крэкинга с помощью OllyDbg.docx
    ТипСтатья
    #25338

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

    Данная статья приведена исключительно в информационно-ознакомительных целях. Коллектив проекта "DAXA" не несет никакой ответственности.

    "Урок крэкинга с помощью OllyDbg"


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

    Приступим!, для начала качаем весь необходимый софт.
    1.Самое главное это отладчик, именно с помощью этой программы мы будем препарировать нашу тестовую программку.
    Мы будем использовать отладчик OllyDbg v.1.10.
    Качаем тут - http://cracklab.ru/_dl/new/ollydbg110xp.rar

    2.Еще нам необходим Hex редактор, для чего я объясню дальше. Называется программа Xvi32. Можете использовать любой другой.
    Качаем тут - http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip.

    3.И собственно наша тестовая программа.
    Качаем тут - http://daxa.com.ua/rar/TestP.rar

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

    1.CPU
    2.Breakpoints
    3.Patches

    Все остальные окна рекомендую закрыть, чтоб они нам не мешали. Теперь разъясню нашу задачу, нам необходимо либо сделать так чтоб программа принимала любой ключ или вообще не выводила сообщение о регистрации и навсегда забыла о ней :). И так приступим, попробую описать все пошагово.

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

    http://daxa.com.ua/img/olly/1.gif


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

    http://daxa.com.ua/img/olly/2.gif

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

    http://daxa.com.ua/img/olly/3.gif

    Далее нажимаем на эту кнопку http://daxa.com.ua/img/olly/4.gif для того чтоб загрузить нашу программу заново. Теперь надо дойди до точки останова для этого нажимаем http://daxa.com.ua/img/olly/5.gif для того чтоб выполнить нашу программу и видим что выполнение остановилось на нашей точке останова. Для того чтоб зайти в функцию нажимаем клавишу F7. Думаю вы поняли разницу между F8 и F7, первая трассирует программу без захода в функции , вторая с заходом в функции. Видим такую картину.

    http://daxa.com.ua/img/olly/6.gif

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

    http://daxa.com.ua/img/olly/7.gif

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

    http://daxa.com.ua/img/olly/8.gif

    Жмем http://daxa.com.ua/img/olly/4.gif и опять http://daxa.com.ua/img/olly/5.gif , видим что выполнение остановилось на нашей первой точке останова, а нам надо ко второй, для этого жмем еще раз http://daxa.com.ua/img/olly/5.gif, выполнение дойдет до второй точки останова. Заходим в функцию клавишей F7, видим следующее.

    http://daxa.com.ua/img/olly/9.gif

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

    http://daxa.com.ua/img/olly/10.gif

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

    http://daxa.com.ua/img/olly/11.gif

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

    http://daxa.com.ua/img/olly/12.gif

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

    http://daxa.com.ua/img/olly/13.gif

    вылезло оно на этой строчке,

    http://daxa.com.ua/img/olly/14.gif

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

    http://daxa.com.ua/img/olly/15.gif

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

    http://daxa.com.ua/img/olly/16.gif

    и нажимаем кнопку http://daxa.com.ua/img/olly/5.gif и видим что окошко полностью нарисовалось, ждет от нас ввода, программа остановилась тут, в цикле. Далее вводим любой ключ, нажимаем ОК.

    http://daxa.com.ua/img/olly/17.gif

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

    http://daxa.com.ua/img/olly/18.gif

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

    http://daxa.com.ua/img/olly/20.gif

    И видим что в регистре 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

    http://daxa.com.ua/img/olly/21.gif

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

    http://daxa.com.ua/img/olly/22.gif

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

    http://daxa.com.ua/img/olly/23.gif
    на это.

    http://daxa.com.ua/img/olly/24.gif


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

    http://daxa.com.ua/img/olly/25.gif

    Теперь проверяем или работает. Нажимаем кнопочку http://daxa.com.ua/img/olly/4.gif, в окне Breakpoints нажимаем правой клавишей мышки и в меню выбираем Disable All. Далее в окне Patches на нашей строке нажимаем правой и в меню выбираем Apply Patch. После этого жмем кнопку http://daxa.com.ua/img/olly/5.gif, выводиться окошко с запросом ключа, вводим любой ключ, нажимаем ок и наша программа зарегистрирована. Конкретно эта программа будет всегда спрашивать ключ, так как это просто тест, а реальная программа записала бы себе что вы правильно ввели ключ.
    Приметка! Тут удалось сразу найти нужный нам кусочек кода, но не всегда все будет так просто. Иногда придется пробовать по очереди все структуры такого типа.

    3.Последний шаг, надо зашить патч в программу для этого нам и нужен Hex редактор. Итак открываем его и выбираем нашу программу, откроеться туча шестнадцетиричных цифр. Нам надо найти строку JE SHORT TestP.00453B4A в шестнадцатеричном виде и заметь её на нашу. Я думаю вы заметили что в окне CPU(OllyDbg) напротив каждой строки пишется её шестнадцатеричный вид. Для того чтобы точно найти эту строку ищем так, не просто вводим искать 74 2B, а берем еще предыдущую строку кода и ищем так E8 3B 07 FB FF 74 2B

    http://daxa.com.ua/img/olly/26.gif

    , в exe файле код идет цепочкой, по этому мы и берём предыдущую строку. Для чего же мы это делаем , просто такая маленькая строка как 74 2B может повторяться несколько раз потому мы и берем еще предыдущую строку чтоб найти именно то что нам нужно. Далее смотрим как в шестнадцатеричном коде выглядит наша видоизмененная строка JMP SHORT TestP.00453B4A, выглядит она так EB 2B вот мы и заменяем найденную строку на нашу, для это нажимаем кнопочку http://daxa.com.ua/img/olly/27.gif и заменяем строки так

    http://daxa.com.ua/img/olly/28.gif

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

    ВАЖНО!! Прежде чем приступать к манипуляциям c программами необходимо проверить или *.exe файл небыл запакован. Для этого вам понадобиться данная утилита PEiD Качать тут -http://cracklab.narod.ru/tools/peid.zip. Как это все делается тема отдельной статьи, предлагаю в этом разобраться вам самим.


    написать администратору сайта