Предисловие Эта статья для тех, кто захотел войти в мир реверс инжиниринга, но пока не знает с чего начать. Хотелось одной статьёй дать ответы на многие вопросы. Я написал эту статью потому, что когда сам был новичком, хотел иметь под рукой что-то подобное. Пойди туда, потом туда, ставь то, вылезет это. Это же не интересно. Хотел показать на решении одной задачи множество способов решения подобных. Вообще приятно, что на antichat'е развивается этот раздел. Поэтому здесь должна быть эта статья. Просьба к бывалым крякерам Не ворчать, что опять взяли первый crackme Fant0m’а. Мол ничего посложнее взять не мог. Была мыслишка самому написать постой crackme и постепенно усложнять его ( полиморфизм, антиотладка и т.д.), постепенно дотянуть до 6 крякмисов, но некогда. Подготовка Это самая трудоёмкая часть ибо, сначала нужно узнать, как делаются .exe, как работают, что там внутри. На это придётся потратить уйму времени. Но для начала хватит азов. Итак, с чего начнём? А начнём мы со скачивания полезной документации. То есть WinAPI справочников и какого-нибудь учебника по ассемблеру (не забудьте почитать про оптимизацию). Лично я начинал с http://wasm.ru/publist.php?list=22, затем “Уроки Iczelion'а” и т.п. Второй шаг. Качаем необходимый софт. Я пользуюсь Ollydbg, SoftIce, Win32Dasm, IDA, DeDe в зависимости от ситуации. Сейчас в первую очередь вам понадобится Ollydbg, SoftIce. Эти отладчики и плагины к ним легко можно найти в Интернете, к примеру, на wasm.ru, www.cracklab.ru и http://reversing.kulichki.net. Подробней об установке SoftIce можно узнать в FAQ’е от FORUM’a WASM.RU (имхо очень полезная вещь). Третий шаг. Ищем “жертву”. Я советую начать с CrackMe от Fantom’a. Коллекцию его крякмисов можно найти на http://www.crackmes.de. Далее поискать что-нибудь посложнее, а уже потом перейти к исследованию программ. Действуем 1. Самое начало Запускаем первый crackme. Просит ввести пасс. Вводим любую строчку. Видим сообщение:”Wrong Password! Keep trying? You’ll get it!”. Программа считывает введёный пароль, проверяет со своим и выкидывает MessageBox. Берём Ollydbg (по правилам мы не должны пользоваться дебаггером, но воспользуемся им как дизассемблером, или кто хочет может воспользоваться Win32Dasm) и открываем CRACKME1.EXE. И видим, уже знакомые, ассемблерные команды и WinAPI функции. Сразу же видим функцию создания диалогового окна. Следовательно, ищем функцию GetDlgItemTextA, которая, как вы знаете из уроков Iczelion'а, считывает текст с EditBox’а. Сразу же под ней находится функция lstrcmp. Она сравнивает две строки, адрес одной совпадает с адресом буфера для считываемого текста, а другой принадлежит некой строке “m0tNaF-EmKCARc”. Следовательно, m0tNaF-EmKCARc и есть пароль. Проверим. You got it! Your now a cracker! Отлично. Теперь проверим, так ли всё было как я сказал. Чтобы запустить программу жмём F9. Ставим точку отсанова (далее брейк или breakpoint) на ‘push адрес_второй_строки‘. Теперь, когда программа пойдёт по этому адресу, она остановится, и мы сможем подсмотреть некоторые параметры. Вводим любой пасс, например 11111111, и жмём Check. Теперь мы можем увидеть String2="11111111". Вот видите, всё прошло, как я и сказал. Жмём ещё F9, программа идет дальше, и мы видим уже знакомый MessageBox. Можно ещё ставить брейки и жать F9. “Можно гонять дерьмо через мясорубку туда обратно, при этом качество дерьма не изменится.” Как из хорошей вещи сделать гавно. (c) Бу, ассистент Клюпочка (Jane Air). Позволю себе перефразировать так: “Можно гонять код через OllyDbg туда обратно, при этом качество кода не изменится”. Если хотите выполнять программу пошагово (это называется трассировка), то нажимайте F8 (без захода в функции), F7 (с заходом в функции). Ну как? Нашли правильный пароль заодно с OllyDbg (также известный как Оля) познакомились. 2. SoftIce Также очень удобная вещь. Запускаем bat’ник Start SoftICE и жмём Ctrl+D. Мы знаем что программа скорее всего использует такие функции как GetWindowTextA, GetDlgItemTextA. Поэтому ставим брейк на вызов этих функций. Просто пишем bpx GetDlgItemTextA, жмём Enter и выходим (тоже через Ctrl+D). Запускаем, вводим, жмём. Мы опять оказались в отладчике. Проверяем, в ту ли прогу попали, код то вы уже видели, если не та, то выходим и снова попадаем в отладчик ну и т.д. Для просмотра всех установленных bpx’ов вводим bl, для удаления bc n (где n – номер брейка). 3. Патчим Сейчас мы исправим программу, так чтобы любой пароль считался правильным. Открываем наш crackme через Ollydbg. Смотрим код, т.к. мы с ним уже знакомы, давайте сразу найдём lstrcmp. Если строки идентичны, то регистр EAX равен 0. За функцией идёт команда cmp eax,0. Она сравнивает EAX с нулём, и если он равен нулю, то с помощью je мы перенесёмся к необходимому MessageBox’у. Самый распространённый вариант заменить je на jmp. Для этого два раза щёлкаем по строке с je и, в появившемся окне, заменяем je на jmp. Жмём F9 и вставляем любой пароль. Работает! Теперь попробуем по другому. В функции сравнения заменяем адрес второй строки на адрес первой или наоборот. Так как строка равна сама себе, то функция будет всегда возвращать 0. И т.д. и т.п. 4. ArtMoney Но это ещё не всё, сейчас будем знакомиться с взломом этой же программы с помощью ArtMoney. Да, да в некоторых случаях и такое возможно. Я бы сказал это очень, очень большая редкость, т.к. программы пишут далеко не дураки. Нет, я не хочу сказать ничего плохого про автора crackme, это же первый crackme для новичков, поэтому можно (нужно) через lstrcmp. Итак, ближе к делу! Запускаем первый CRACKME1.EXE. Вводим любой пасс, пусть это опять будет “11111111”, жмём Check, и оставляем всё, как есть. Запускаем ArtMoney (столь полезную в хозяйстве вещь), выбираем нужный процесс. Искать: точное значение. Значение: введенный пароль. Тип: ваш набор. Жмём OK. Нашлись два адреса. Выделяем первый, жмём на правую клавишу, выбираем “Редактор памяти”. В разделе текст ищем в пределе 8 строк (как вверх, так и вниз) что-то похожее на пароль. Ничего. Как узнать, что есть пароль? Просто отсеиваем уже известные нам строки. (You got it! Your now a cracker!) Точно также проверяем второй адрес и, о чудо, чуть выше видим m0tNaF-EmKCARc. Кстати тоже самое можно провернуть с SoftIce. Вводим s 0 l -1 "пароль который вы ввели". S - означает поиск, от слова search, 0 - c какого адреса в памяти искать, l - сокращение от слова length (длина), -1 - размер области памяти в которой искать (-1 = FFFFFFFF). 5. Распаковка CRACKL@B - Распаковка - от самого простого к чуть более сложному. Там всё сказано. Если не получается что ж, читайте, учите, пробуйте. Если проделали всё как описано в статье, а всё равно не получается. Есть выход, сомнительный правда, а вдруг прокатит, трейсить и комментировать всё что видишь. У меня однажды было так. Прошёлся до некого адреса и увидел, что всё идет к созданию диалогового окна (call eax и т.п.), правда все параметры были напутаны между собой и функциями, я решил выделить все параметры функции создания диалогового окна. Среди них отыскал адрес функции, которой передаются параметры. Полюбому проверка пасса должна быть там, и она там была, как оказалось. CrackMe решился. Поэтому прежде чем забить на всё постарайтесь подключить логику. Выводы Существует множество способов для решения одной задачи. И использовать можно любые подручные средства. К примеру, ArtMoney я использую для поиска адресов, куда записываются пароли, а дальше в SoftIce или Ollydbg можно уже определиться, что к чему. Не забывайте, что самый главный инструмент c крекера - это голова. Ссылки http://www.crackmes.de – целая куча крякмисов http://wasm.ru – программирование на ассемблере, исходники, инструменты http://www.cracklab.ru – туторы по исследованию программ, инструменты http://wasm.ru/article.php?article=fb - cоздание сканера процессов, что-то типа ArtMoney http://reversing.kulichki.net – инструменты http://www.exmortis.narod.ru/ - исходники компиляторов и дизассемблеров P.S. Теперь и вы можете проделать это, не выходя из дома. Надеюсь, эта статья хоть кому-нибудь помогла.