КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
Александр Панов. Реверсинг и зашита программ от взлома.
Запускаем программу CrackMe-1.exe. Мы видим окно с текстовым полем, в котором надо ввести пароль. Давайте попробуем что-нибудь ввести и нажать кнопку ОК. Я ввел цифры "12345" и нажал кнопку ОК. В результате получено сообщение о том, что пароль неверный.
Перед реверсингом программы мы должны узнать о программе как можно больше. Самое первое, что мы должны у знать, это (именно в таком порядке!):
Давайте займемся нашим "узнаванием". Для реализации первого пункта запускаем утилизу PEiD (или, полностью, РЕ iDenliller v0.95 by snaker, Qweilon & Jibz). При запуске этой утилиты появляется окно.
Нажимаем кнопку, расположенную справа от ноля File, находим и открываем наш файл CRAKME-1.EXE (можно просто перетащить наш файл CRAKME-1.EXE в окно PEiD c помощью мыши.) Программа PEiD проанализирует файл и выведет информацию о нем в своем окне.
Как мы видим, в нижней строке нам написали "Borland C++ 1999". Это значит, что исследуемая программа написана на языке программирования C++ фирмы Borland и ничем не зашифрована и не запакована (имеются в виду шифровальщики, или протекторы, и паковщики сторонних разработчиков, такие как UPS, ASP Pack и т. д.).
Тут хочу сказать следующее. Никогда не полагайтесь только на одну программу-идентификатор протекторов/паковщиков. Это связано с тем, что есть множество способов обмана той или иной программы-идентификатора. Лучше используйте все, что у вас есть.
Итак, раз программа ничем не запакована, то мы можем смело запускать отладчик и загружать программу в него. Отладчик лучше всего развернуть на полный экран.
Как видим, OllyDbg остановился на самом начале файла, точнее, на точке входа в программу. Раз программа ничем не запакована, есть шанс, что программист не стал мучаться и делать защиту в программе. Очень странно, но большинство программистов именно так и поступает. Думаю, дело в том, что все свои силы программист отдает созданию программы, а чтобы придумать защиту, их у него уже не остается.
Первое, что может прийти в голову, это постараться найти в теле программы строки, которые она выводит па экран (например, "password FALSE"). Большинство программистов не шифрует выводимые данные в программе, а раз так, этим можно воспользоваться.
Поэтому давайте выполним поиск всех текстовых строк в файле. Для этого мы в главном окне (окне кода) нажимаем правую кнопку мыши и выбираем в контекстном меню команд: Search for > All referenced text strings.
Отладчик выдаст нам все найденные текстовые строки.
Сообщение о неправильном пароле не зашифровано. Нам очень повезло — попался ленивый программист. Двойной щелчок мышкой на строчку password FALSE в отладчике и попадаем на код, срабатывающий в том случае, если введенный пароль не верен.
Ввидим вызов функции MessageBoxA. Но нам неинтересно, что делается в программе после того, как нам сообщили о неверном пароле. Нам нужен сам пароль. Поэтому давайте пролистаем содержимое главного окна отладчика немного вверх — до тех пор, пока не увидим сообщение о том, что введен правильный пароль.
Обратите внимание на стрелочки, которые находятся левее кода инструкции. Эти стрелки показывают направление перехода. То есть откуда или куда происходит переход после срабатывания логики в программе.
Если нажать мышкой на эту стрелочку (или просто выделить строку рядом со стрелкой), то мы наглядно увидим данный переход. Давайте выделим мышкой строку.
Мы видим, что переход на наше сообщение о неверном пароле осуществляется с адреса 00401C558. Как вы знаете, в ассемблере функция je осуществляет условный переход. Исходя из этого, сделаем вывод, что некая функция проверяет наш пароль на правильность и, если он верен, переходит на строку по адресу 00401С77, а если не верен, то на строку по адресу 00401C5A.
Таким образом, получается, что функция проверки правильности пароля находится выше строки:
Давайте пролистаем окно кода отладчика немного вверх, вот до таких строк:
Как вы знаете, функция ассемблера CMP выполняет сравнение. А после сравнения сразу стоит переход:
Давайте поставим брекпойпт на CMP. Для этого нужно выделить строку с помощью мыши и нажать клавишу F2. Адрес окрасится красным цветом.
Теперь запустим программу в отладчике. Для этого нажмем клавишу F9. Наша программа запустилась, но в отладчик не попала. Что это значит? Это значит, что пока код, где мы поставили точку останова (брекпойпт), не выполнялся. Давайте введем любой пароль в окне программы CRAKME-1.EXE и нажмем кнопку ОК.
Вот! Мы попали в отладчик.
Теперь давайте будем трассировать программу с помощью клавиши F8, вот до этого момента
И что же мы видим в окне регистров? А, точнее, в регистре EAX?
Мы видим наш заветный пароль: S4K6n37fE.
Давайте попробуем ввести его в окне исследуемой нами программы.
Мы получим сообщение.
Вот таким образом обходятся подобные защиты. Еще раз хочу заметить, что тут все несложно.