Cracking: шаг второй

Xakep, номер #045, стр. 045-040-3


Но вернемся к нашему кролику. Если ты еще не забыл, нам необходимо отследить вызовы функции TCustomForm::Show. Для этого нужно установить точку останова (breakpoint). Выполним команду BPX 44EE90 (адрес мы взяли в IDA). Теперь каждый раз, когда программа будет выполнять эту функцию, мы будем выпадать в отладчик. Запусти программу на выполнение (команда X или G, либо клавиша [F5]). Как видишь, ты практически сразу же оказался опять в отладчике. Это сработал наш breakpoint. Т.е. программа собирается вывести окно (мы ее остановили в начале процедуры вывода). Продолжи выполнение. Появилась заставка, и ты снова вывалился в отладчик. Сейчас будет выведено еще одно окно. Жмем [F5] и видим тот самый nag-screen, от которого хотим избавиться. Значит, второй вызов процедуры и выводит не полюбившееся нам окно. Жмем кнопку "Quit". И заново запускаем программу через загрузчик. Затем [F5] для запуска до первого останова и еще раз до второго. Сейчас программа остановлена в начале процедуры вывода nag-окна. Но функция TCustomForm::Show используется для вывода всех форм. Поэтому наша задача вернуться через стек на несколько процедур назад, к тому вызову, который отвечает только за nag-screen. Есть один момент, который должен нам помочь. Ведь это окно появляется только в случае, если программа не зарегистрирована. Значит, скорее всего, перед нужным нам вызовом должна происходить проверка на предмет отсутствия в твоем кармане 69.95 вечнозеленых, отданных за регистрационный ключ. Проверим наши умозаключения. Для возвращения из текущей процедуры к точке, откуда она была вызвана (а точнее - к следующей за вызовом инструкции) служит команда P RET (или клавиша [F12]). Попробуем нажимать ее, пока перед вызовом не увидим команду сравнения. После двух возвратов программа перестала выпадать в отладчик и заработало nag-окно. Нажимаем на нем кнопку "I Agree", еще 3 возврата, и появляется нечто похожее на то, что нам нужно:

005083EA MOV EAX, [005142D8]

005083EF MOV EAX, [EAX]

005083F1 CMP BYTE PTR [EAX+000002FC], 00

005083F8 JNZ 00508409

005083FA MOV EAX, [005142D8]

005083FF MOV EAX, [EAX]

00508401 MOV EDX, [EAX]

00508403 CALL [EDX+000000D8]

00508409 RET

По адресу 00508403 находится вызов, из которого программа только что вернулась. А по адресу 005083F8 - условный переход, обходящий этот вызов. Даем команду продолжить выполнение и выходим из программы. Заново запускаем отладку, удаляем наш breakpoint (команда BC *) и устанавливаем новый (BPX 5083F8). После продолжения вываливаемся в отладчик как раз на условном переходе. Чтобы перескочить процедуру вывода nag-окна, сбрасываем флаг Z в регистре флагов (команда R FL=-Z). Продолжаем выполнение. И что мы видим? Видим сразу главное окно программы. Никакого nag-окошка. Победа! Бежим к холодильнику за пивом.

Назад на стр. 045-040-2  Содержание  Вперед на стр. 045-040-4