R0 CREW

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

Автор: 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-модели…) и… Построить хорошую модель себе :wink:

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

AbreC © r0 Crew

А че бы тебя бить? Молодец хорошая статья. Продолжай;-)

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

Offtop

Баг с картинками поправлен. Так же немного отредактировал вашу статью, если что не понравится можете изменить обратно. Файл - залил на наш сервер.

Насчет root’a: http://forum.reverse4you.org/thread/1082

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

Большое спасибо всем! :slight_smile:
Рад, что мое начинание не осталось без внимания.
Буду писать по мере возможности - времени, к сожалению, не хватает…

Эффективней будет так:

  1. Вводим пароль
  2. Ищем его в памяти
  3. Если адрес куда он сохраняется статичен и не находится стеке то
    • Ставим бряк на него
    • Прерываемся в адресном пространстве user32.dll
    • Исполняем до кода пользователя
    • И вот мы в нужном месте

Поздравляю, Вы справились с заданием =)

Не случайно, это пароль.
Я его нашел таким методом:

  1. Поискал функции на импорт
  2. Нашел lstrcmpA
  3. Поставил бряк
  4. При вызове рассмотрел параметры, один из них был указателем на нужную строку.