Автор: 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.
Следовательно, существует несколько других способов обхода защиты.
Эти способы я предлагаю найти уважаемому читателю (предположительно начинающему реверсеру).
А для облегчения жизни даю следующие задачи:- Найти код проверки стандартным способом, т.е. через GetDlgItemText;
- Поправить код таким образом, чтобы пароль выводился через MessageBoxA;
- Сделать правку библиотеки и заставить программу подгрузить именно ее, а не стандартную.
Как Вы видите, задачи идут по нарастающей сложности.
А когда Вы все это сделаете - можете скачать ДазСтудио (пакет 3D-модели...) и... Построить хорошую модель себе ;)
[+++++++++++++++++++++++++++++++++++++++++++++++++]
AbreC © r0 Crew