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

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

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

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


Invoke lstrlen,ADDR UserName

Invoke lstrlen,ADDR RegNumber

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

Наша задача не оставить ни одного адреса. Только имена переменных. Посмотрим, что дальше: «XOR BL,BYTE PTR DS:[EAX+406328]». Что еще за 406328? В Olly все содержимое памяти, ответственной за секцию .data, показано окном ниже отладочного кода. Найдем там этот адрес. Как видим, ничего вразумительного там не написано. Строка из 20-ти байт, с обеих сторон ограниченная нулями. Причем если перезагрузим программу в Olly без запуска, а потом сгенерируем код, то сможем убедиться, что эта строка присутствует как при инициализации crackme.exe, так и после генерации регистрационного кода. И ни один ее байт не меняется. Но если мы немного вглядимся в алгоритм, то сможем заметить, что программа неоднократно обращается к разным смещениям этой строки. Из всего этого можно сделать только один вывод – это ключ, с помощью которого crackme.exe генерирует регистрационный номер. Наша задача этот ключ инициализировать у себя.

С объявлением переменных опять придется подождать, сначала создадим сам ключ. Если внимательно присмотреться, то можно заметить, что алгоритм обращается также к адресу 406327. Значит, это и есть первый байт нашего ключа. Теперь скопируем байты ключа в шестнадцатеричных значениях и подставим перед самим алгоритмом следующий код:

mov byte ptr ds:[SecretKey],0

mov byte ptr ds:[SecretKey+1],0AAh

mov byte ptr ds:[SecretKey+2],89h

...и так далее до

mov byte ptr ds:[SecretKey+20],73h

Не забываем про два правила: после шестнадцатеричного числа ставим знак «h» и, если число начинается на букву, то приписываем перед ним «0». Теперь берем 406327 за «SecretKey», а все, что больше, приписываем к «SecretKey» через «+» соответствующее количество байтов. Так мы сможем безболезненно работать с ключом.

Теперь у нас остаются еще два адреса, которым мы не придумали имена переменных. По адресу 00406345 находятся четыре зарезервированных байта, по которым последовательно прогоняются символы из имени пользователя, назовем его lUserName. А по 00406749 находится область, по размеру точно такая же, как и регистрационный номер (10 символов). Служит она только для того, чтобы поменять в обратном порядке цифры номера. Назовем ее genRegNumber. Все, остальное - дело техники. Осталось только подправить значения переменных и объявить их в секции .data?:

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