Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Тренируемся на кошках

Виталий "Vir_rus" Чернов

Хакер, номер #095, стр. 095-078-2


И все бы ничего, да только этот метод прокатывает далеко не всегда. Иногда правильность регистрационного номера проверяется в разных местах программы, в разное время и при разных условиях. Поэтому...

Экзекуция #2

Сейчас мы сделаем так, чтобы наш crackme.exe сам показывал нам верный серийник в ответ на любое введенное имя пользователя. Опять открываем программу в Olly и пишем в командной строке «bpx GetDlgItemTextA», то есть ставим бряк на все получения текстовых строк из edit’ов. Жмем F9, вводим имя, регистрационный код, жмем «Check it!» и попадаем на 00401141. Нажимаем один раз F8, чтобы выполнилась процедура, и смотрим дальше. Идет проверка на количество символов в имени пользователя (как оказалось, их должно быть не менее четырех). Кстати, после выполнения процедуры GetDlgItemTextA в регистр EDX возвратился адрес нашего имени. Именно оттуда я и узнал, что это только проверка на количество символов в имени. Значит, генерация номера идет дальше. Опять жмем F9 и видим, что теперь мы попадаем прямиком на проверку серийного номера, причем в процедуре выше и в процедуре ниже уже есть адреса памяти, в которых содержится сгенерированный номер. Теперь нам только остается поменять строку «GetDlgItemTextA» на «SetDlgItemTextA» и передать функции адрес регистрационного номера. Так-то оно так, да вот только в программе не используется «SetDlgItemTextA», и в User32.dll эта процедура не определена. Но это ничего, зато у нас определена процедура SendDlgItemMessageA, которая хоть и занимает чуть больше байт, но в данном случае выполнит то же самое, что и SetDlgItemTextA. Посмотрим, по какому адресу она у нас находится... Откроем View->Memory и найдем дерективу .code в модуле crackme. Вот он - адрес этой процедуры - 004013A2. В любом API справочнике можно прочитать, что процедура требует пять параметров плюс вызов самой процедуры. Где же нам взять столько свободного места, не изменяя размера файла? А вот где. Вывод MessageBoxA нам теперь не нужен. Ни первый, ни второй. Но оба затирать совсем необязательно, а вот тот, который идет первым (с сообщением об удачной регистрации), нам теперь точно не пригодится, а заодно и переход, который мы меняли в первой экзекуции, тоже можно затереть. А те байты, что останутся лишними, мы оставим nop’ами (nop – команда, которая ничего не выполняет, но занимает один байт).

Назад на стр. 095-078-1  Содержание  Вперед на стр. 095-078-3