Тренируемся на кошках Виталий "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?: |