Крякинг — это просто Степан Ильин aka Step Хакер, номер #080, стр. 080-070-2 [немного теории] Возьмем первый крякмис из коллекции — FaNt0m's CrackMe #1. В задании требуется найти серийник, при этом используя исключительно дизассемблер. Использовать дебаггер по условию запрещено, но он, собственно и не требуется. Посмотрим, что собой представляет программа: обычное окно с текстовым полем для ввода. После ввода случайного значения (например, слова «хакер»), появляется всплывающее окно с ошибкой «Wrong password. Keep trying, you’ll get it!». От этого, собственно, мы и будем крутиться. Текстовые строки информационных сообщений зачастую хранятся в самом коде программы. Соответственно, если найти обращение к строке, то без труда найдется и вызов функции вывода сообщения, а там уже и процедура проверки серийника недалеко. Попробуем разобраться во всем более подробно. В общем случае программа состоит из трех областей памяти (сегментов): сегмента кода (CS), сегмента данных (DS) и сегмента стека (SS). В первом, как ты понял, хранится непосредственно код программы, т.е. команды и командные инструкции. Второй сегмент предназначен для хранения данных (переменных, констант и т.д.) — по идее, выданное программой сообщение располагается именно там. Сегмент стека представляет собой специальную область памяти, предназначенную для временного хранения данных: например, параметров, передаваемых процедурам и функциям. Слово «стек» подразумевает использование принципа FILO (First In – Last Out, «первым пришел — последним вышел»). Последнее занесенное в стек (командой PUSH) значение, будет извлечено (командой POP) первым, предпоследнее — вторым и т.д. Можно наглядно представить себе это, вообразив колоду карт. Если ты знаком с программированием под Windows, то должен знать, что стандартное окно с сообщением чаще всего выводится с помощью специальной API-функции MessageBoxA. Сама строка сообщения и прочие параметры окна помещаются в стек, откуда позже извлекаются и обрабатываются функцией (это самый распространенный способ передачи параметров функции в языке ассемблер). Получается, что после ввода неправильного (ты же не думаешь его угадать, верно?) серийника, программа загружает в стек адрес строки и вызывает функцию MessageBoxA. W32Dasm, как и многие другие дизассемблеры, умеет показывать, где именно происходит обращение к той или иной строке. Это значительно облегчает поиск нужного фрагмента кода: достаточно в дизассемблированном листинге произвести поиск текста сообщения, и мы сразу найдем нужный вызов функции MessageBoxA. В большинстве случаев где-нибудь рядом располагается и процедура проверки серийника. Наша задача — с помощью дизассемблера посмотреть правильный пароль во время сравнения его со введенным. |