Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #80, АВГУСТ 2005 г.

Крякинг — это просто

Степан Ильин aka Step

Хакер, номер #080, стр. 080-070-5


Если ты уже когда-то пробовал ломать программы, то наверняка слышал о так называемых брейкпоинтах (breakpoints). Брейкпоинт — это место останова программы, т.е. точка, в которой программа приостанавливает свое выполнение и указывает адрес текущей команды в отладчике. Использовать этот чрезвычайно полезный прием очень просто. Нам уже известно, что небольшое окошко с сообщением легко может быть выведено на экран с помощью функции MessageBoxA. Теперь все, что от нас требуется — установить точку останова на вызов этой функции, а после остановки программы всего лишь «вырезать» из кода ее вызов. Попробуем?

Если ты правильно установил OllyDBG и подключил чрезвычайно полезный плагин CommandBar, то в нижней части экрана должно светиться окно для ввода команды.

Введем команду для установки точки останова на вызове функции MessageBoxA: bpx MessageBoxA. Правильность установки брейкпоинта можно проверить в окне Breakpoints (меню View -> Breakpoints). Там же его можно на время деактивировать, или вовсе удалить. Далее необходимо запустить программу из отладчика — для этого нажми клавишу F9 или выбери в меню Debug -> Run.

Программа сразу же остановилась на команде с адресом 004010DE:

004010DE CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA

Мы получили то, что хотели — программа остановилась до вызова функции MessageBoxA. Если ты выполняешь действия параллельно со мной, то наверняка приятно удивлен, что OllyDBG приводит расшифровку параметров, которые передаются этой процедуре. Очень наглядно и удобно.

[нет операции]

Теперь разберемся, как этот вызов можно убрать. В этом нам поможет специальная инструкция ассемблера — «нет операции» (NOP). Для того, чтобы убрать вызов процедуры (или любой другой код), достаточно забить его машинный код командами NOP. В результате в программе образуется своеобразная «дырка», но на работоспособность она ни коем образом не повлияет. Правда, здесь есть один нюанс. Машинный эквивалент команды NOP (в шестнадцатеричном представлении — 90) занимает один байт, в тоже время машинная команда, вызывающая функцию MessageBoxA (E8 C5010000), — целых 5. Несоответствия быть не должно, и чтобы полностью перекрыть исходную команду нужно использовать команду NOP 5 раз. К счастью, OllyDBG полностью избавляет нас от лишнего геморроя. Кликни правой кнопкой мыши на строке, где произошла точка останова, и выбери в меню Binary -> Fill with NOPs. Отладчик самостоятельно заполнит команду NOP’ами нужное число раз. Теперь можно продолжить выполнение программы — нажимаем F9. Сразу выясняется две новости: одна хорошая, другая — нет. Начну с хорошей: первый наг-скрин мы убрали. Плохая новость заключается в том, что другой наг остался на месте. Почему? Видимо, он отображается с помощью другой API-функцией, на которую брейкпоинт не установлен. Не беда. Открываем окно References (View -> References): после установки первого брейкпоинта сюда записался список всех вызываемых программой функций. С базовыми знаниями API (или мануалом под рукой) можно предположить, что второй наг выводится с помощью функции DialogBoxParamA. Предлагаю проверить тебе это самому.

Назад на стр. 080-070-4  Содержание  Вперед на стр. 080-070-6