+ Reply to Thread
Results 1 to 9 of 9

Thread: Первая кровь - для начинающиХ

  1. #1
    AbreC's Avatar

    Default Первая кровь - для начинающиХ

    Автор: AbreC (special for r0 Crew)
    Уровень: Для начинающих
    Программа: Редактор Файлов
    Размер: 667 КБ
    Язык: MS VC++ 6
    Тип защиты: пароль на инсталляторе
    Инструменты: OllyDBG, DiE, ResHacker

    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    iNTRO
    Годах эдак в 2005-2006, когда я был еще тем чайником (не умел нормально работать даже с MS Word) и ужасно интересовался компьютерами, сходил как-то к другу за Visual Basic 6. Не то чтоб я умел программировать, просто хотел научиться.
    Значит, друг зашел в одну папочку, где лежал этот VB6 и я случайно взглядом зацепил программу, которую сегодня мы с Вами поломаем.
    А зацепил я ее потому, что ее название было "Редактор файлов (Нужен Crack)". Я знал, что такое крэк. Но, что значит Редактор Файлов?
    С любопытства все и началось…

    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    wHAT iS tHIS
    Защита программы достаточно примитивна, но она еще используется в реальной жизни - это пароль на инсталлятор.
    Чтобы данная статья не казалась историческим очерком и приносила практическую пользу, поставим следующие вопросы и ответим на них:

    Почему я должен это прочитать?
    Вы не должны, но можете это прочитать, если Вас интересует реверс.

    Что это мне даст?
    Данная статья даст Вам знания, необходимые любому начинающему реверсеру. Будут рассмотрены:
    • Проведение предварительного анализа программы;
    • Нахождение нужного участка кода наиболее эффективными методами;
    • Правка и сохранение результата.
    Зачем мне это нужно?
    Чтобы быстрее добиться нужных Вам как начинающему реверсеру результатов и, возможно, сказать: "Yeeeees, I did it!".

    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    aNALYSIS
    Итак, для начала рассмотрим нашу базу - это корневой каталог диска X, а в ней собственно инсталлятор, который нам мешает жить, Olly Debugger (в народе Оля), Detect It Easy (короче DiE) и старый добрый Resource Hacker.

    Запустим программу-инсталлятор и посмотрим, чем она нам мешает. Запускаем и видим следующую сцену:

    Как мы видим, наша программа имеет GUI-интерфейс, вместо лицензионного соглашения выводится сообщение, с которым нам почему-то необходимо согласиться (предложение "Вы согласны? - тогда вперед" улыбает).
    Жмем "Да", видим строку ввода, вводим что-нибудь и слышим характерный "BEEP". То есть без пароля не пройдешь…
    Тогда мы пытаемся зайти на http://ig-soft.com/ , но видим, что сайт давно в дауне и, естественно, пароль нам неоткуда брать. А программа все с тем же упорством требует ключа.
    Ну, разве это дело?!
    Нет, конечно. Поэтому открываем программу в DiE и видим следующее:

    То есть, программа написана на C++, компилятор МелкоМягких, версия 6 и все такое.
    Радуемся (начинающие), что программа хотя бы не на Visual Basic 6 и смотрим дальше:

    Есть секция ресурсов - это значит, что в программе, скорее всего, будут сорцы окон, иконки, картинки, строки и много еще чего.
    Открываем программу в Resource Hacker и смотрим:

    К сожалению, форм окон не оказалось - есть только иконы и строки.
    Отсутствие форм окон наводит на одну мысль - скорее всего, подключается библиотека, в которой есть эти окна.
    Проверим нашу мысль - подключается ли действительно библиотека?

    В импортах мы видим API-функцию MessageBoxA библиотеки USER32.DLL, которая вызывается при выходе из программы. Но она нас не интересует, поэтому смотрим дальше:

    В функциях библа KERNEL32.DLL есть искомая нами функция - LoadLibraryA. Она и позволяет программе подключать библиотеки после запуска программы.
    Вообще есть два варианта подключения библиотеки: через импорт (то что мы видим в DiE) и через непосредственное подключение программы во время исполнения (когда используется LoadLibrary и подобные ему функции).
    Теперь можно сделать вывод - подключается библиотека.
    Следовательно, ее необходимо найти.
    Зачем?
    Раз формы окна заключены в библиотеке, то библиотека и будет (скорее всего) обрабатывать поступающий в окна ввод.
    А раз библиотека обрабатывает ввод (например, ввод пароля), значит, ее мы должны и править.
    У меня стоит XP, поэтому папка для хранения временных файлов имеет путь:
    C:\Documents and Setting\AbreC\Local Settings\Temp
    Смотрим, что у нас находится по этому адресу:

    А находится там у меня папка с загадочным на первый взгляд именем "~vis0000".
    Открываем ее и видим несколько файлов. В том числе и рисунок "default.bmp". Смотрим и видим следующее:

    Очень похоже на картинку инсталлятора. А раз так, значит, мы очень близки к цели - где-то рядом должна быть библиотека.
    А вот и она:

    В папке только одна библиотека и называется она "vise32ex.dll".
    Откроем в DiE и посмотрим содержимое.

    Видим, что написано на все том же Microsoft Visual C++ 6.
    Смотрим дальше и видим, что ресурсы присутствуют в секциях.
    А значит, есть, что рассмотреть в Resource Hacker:

    ResHacker показал нам, что есть сорцы окон в библе, кроме того сразу же найдено окно ввода пароля. И это очень хорошо.
    Смотрим в DiE импорты и находим функцию MessageBeep из USER32.DLL. Именно эта функция позволяет выводить звуковой сигнал "BEEP" при вводе неправильного пароля. Этим мы еще раз убеждаемся, что мы на правильном пути.


    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    pATCHING
    Когда мы разобрались с окнами, перейдем к основной задаче - правка программы таким образом, чтобы она работала и без ввода пароля.
    Итак, запускаем Олю, жмем на кнопку "Открыть" на панели инструментов, и открываем наш "Редактор Файлов".

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

    Наша цель: найти код, который проверяет введенный пароль.
    Что нам в этом может помочь?
    Если еще раз запустить программу, ввести пароль и нажать кнопку "Next", то мы услышим звуковой сигнал. Мы уже говорили, что этот сигнал дает нам API-функция MessageBeep.
    Следовательно, ищем эту функцию. Для этого выполняем "View" -> "Executable Modules" или на панели инструментов нажимаем на кнопку "E".
    В данном окне видны модули (библиотеки), загруженные программой. В самом низу (у меня) можно видеть модуль USER32.DLL. Кликаем по ней правой кнопкой мыши и в контекстном меню выбираем "View names":

    Откроется диалог с именами функций, реализованных в библиотеке USER32.DLL и используемых в программе.
    Находим в списке MessageBeep. Можно просто ввести это имя с клавиатуры - первое совпадающее имя будет высвечено.
    Дальше нажимаем по MessageBeep правой кнопкой мыши и в меню выбираем пункт "Follow in Disassembler".

    Так мы оказываемся внутри библиотеки USER32.DLL. Ставим бряк на входе в функцию и запускаем программу на исполнение.

    Дальше работаем с окном программы. Вводим любой пароль или вообще ничего не вводим и жмем на кнопку "Next".
    Тут должно появиться окно Оли. А в окне наш бряк. Если это так, то кликаем "Execute till user code" в меню "Debug". Это выведет нас из библиотеки в код программы, где используется функция.

    Мы нашли место, где используется функция MessageBeep. Это значит, что мы близки к цели - где-то рядом код, отвечающий за проверку.
    Если Вы посмотрите на рисунок, то можете увидеть инструкцию, выделенную желтым цветом.

    Эта инструкция и проверяет введенный пароль. Заменяем ее NOP’ами.

    После замены код будет выглядеть следующим образом:

    Все, вроде сделаны все необходимые изменения.
    Теперь правой кнопкой мыши открываем контекстное меню и жмем "Copy to executable -> All modifications -> Copy All".
    Запускаем программу на исполнение, при желании вводим что-нибудь в качестве пароля и смотрим на результаты.


    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    eNDING
    В данной статье был рассмотрен самый простой способ обхода защиты инсталлятора - правка (патч) процесса.
    Причем был использован не совсем стандартный подход к нахождению кода проверки пароля - не по функции GetDlgItemText, а по MessageBeep.
    Следовательно, существует несколько других способов обхода защиты.
    Эти способы я предлагаю найти уважаемому читателю (предположительно начинающему реверсеру).
    А для облегчения жизни даю следующие задачи:
    1. Найти код проверки стандартным способом, т.е. через GetDlgItemText;
    2. Поправить код таким образом, чтобы пароль выводился через MessageBoxA;
    3. Сделать правку библиотеки и заставить программу подгрузить именно ее, а не стандартную.
    Как Вы видите, задачи идут по нарастающей сложности.
    А когда Вы все это сделаете - можете скачать ДазСтудио (пакет 3D-модели...) и... Построить хорошую модель себе ;)

    [+++++++++++++++++++++++++++++++++++++++++++++++++]

    AbreC © r0 Crew
    Last edited by AbreC; 15-06-2011 at 22:33.
    You may stop this individual, but you can't stop us all... after all, we're all alike. © The Mentor (Phrack 7, File 3)

  2. 9 пользователя(ей) сказали cпасибо:
    DJ1hAD0 (12-10-2013) Derp (02-01-2014) Rectifier (16-06-2011) defl0rat0r (23-11-2013) denis7656 (14-09-2015) dukeBarman (08-08-2013) hexum (16-06-2011) ximera (15-06-2011) Ærik (16-06-2011)
  3. #2
    ximera's Avatar

    Default Re: Первая кровь - для начинающиХ

    А че бы тебя бить? Молодец хорошая статья. Продолжай
    Чтобы избегать ошибок, надо набираться опыта; чтобы набираться опыта, надо делать ошибки. © Лоренс Питер

    Неизбежное прими достойно. © Сенека Луций Анней

    Господи... храни сумасшедших. © Сумасшедший Фрэнки

  4. #3
    Rectifier's Avatar

    Default Re: Первая кровь - для начинающиХ

    Поддерживаю. Все нормально, не стесняйтесь и продолжайте дальше

    Оффтоп
    Секрет успеха — в постоянстве цели. (Бенджамин Дизраэли)

    Вы должны воплощать ту перемену, которую хотите произвести в мире. (Махатма Ганди)

    Один опыт я ставлю выше, чем тысячу мнений, рожденных только воображением. (Ломоносов)

  5. #4

    Default Re: Первая кровь - для начинающиХ

    Отличная статья. Как подучу ASM, так попробую повторить путь.
    Спасибо!
    Самый лучший раб тот, который не знает, что он раб

  6. #5
    AbreC's Avatar

    Default Re: Первая кровь - для начинающиХ

    Большое спасибо всем!
    Рад, что мое начинание не осталось без внимания.
    Буду писать по мере возможности - времени, к сожалению, не хватает...
    You may stop this individual, but you can't stop us all... after all, we're all alike. © The Mentor (Phrack 7, File 3)

  7. #6
    ЖУДЭ's Avatar

    Default Re: Первая кровь - для начинающиХ

    HTML Code:
    Нахождение нужного участка кода наиболее эффективными методами
    Эффективней будет так:
    1. Вводим пароль
    2. Ищем его в памяти
    3. Если адрес куда он сохраняется статичен и не находится стеке то
    a) Ставим бряк на него
    b) Прерываемся в адресном пространстве user32.dll
    c) Исполняем до кода пользователя
    d) И вот мы в нужном месте

  8. 2 пользователя(ей) сказали cпасибо:
    AbreC (05-08-2011) ximera (24-02-2013)
  9. #7
    AbreC's Avatar

    Default Re: Первая кровь - для начинающиХ

    Причем был использован не совсем стандартный подход к нахождению кода проверки пароля - не по функции GetDlgItemText, а по MessageBeep.
    Следовательно, существует несколько других способов обхода защиты.
    Эти способы я предлагаю найти уважаемому читателю (предположительно начинающему реверсеру).
    Quote Originally Posted by ЖУДЭ View Post
    HTML Code:
    Нахождение нужного участка кода наиболее эффективными методами
    Эффективней будет так:
    1. Вводим пароль
    2. Ищем его в памяти
    3. Если адрес куда он сохраняется статичен и не находится стеке то
    a) Ставим бряк на него
    b) Прерываемся в адресном пространстве user32.dll
    c) Исполняем до кода пользователя
    d) И вот мы в нужном месте
    Поздравляю, Вы справились с заданием =)
    You may stop this individual, but you can't stop us all... after all, we're all alike. © The Mentor (Phrack 7, File 3)

  10. #8

    Default Re: Первая кровь - для начинающиХ


  11. #9
    ximera's Avatar

    Default Re: Первая кровь - для начинающиХ

    Не случайно, это пароль.
    Я его нашел таким методом:
    1. Поискал функции на импорт
    2. Нашел lstrcmpA
    3. Поставил бряк
    4. При вызове рассмотрел параметры, один из них был указателем на нужную строку.
    Чтобы избегать ошибок, надо набираться опыта; чтобы набираться опыта, надо делать ошибки. © Лоренс Питер

    Неизбежное прими достойно. © Сенека Луций Анней

    Господи... храни сумасшедших. © Сумасшедший Фрэнки

+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:36
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org