Тренируемся на кошках Виталий "Vir_rus" Чернов Хакер, номер #095, стр. 095-078-3 Приступим. Для начала встанем на 004012BC, нажмем пробел и напишем «nop». Все байты, находящиеся на этой строке тоже станут nop. То же самое нужно сделать и с последующими пятью строками. Видите, как много места у нас теперь освободилось! Встанем на первый nop и напишем «push 00406749» - это адрес сгенерированного кода(lParam), «push 0» - дополнительная информация, которую сейчас можно оставить на нуле (wParam), «push 0C» - сообщение, которое мы посылаем окну (Msg), «push 64» - идентификатор окна, которому посылаем сообщение (nIDDlgItem), «push dword ptr ss:[ebp+8]» - хэндл родительского окна (hDlg), «call 004013A2» – это, собственно, сама процедура. Все, что ниже, пусть остается nop’ами. Опять запускаем crackme.exe, и программа сама подставляет правильный серийник во второй edit. Снова открываем HIEW и правим вышеуказанные байты на свои. Сохраняем и запускаем. Все работает. Теперь можно подправить форму и вставить свою картинку с помощью любого редактора ресурсов. Это тоже действенный и эффективный способ, но куда приятнее написать свой генератор ключа один раз, а потом просто вставлять дизассемблированный код с алгоритмом из любой программы. Этим мы сейчас и займемся. Экзекуция #3 Теперь мы без труда можем найти место, откуда начинается генерация регистрационного ключа. Оно находится сразу после проверки длины имени. Если имя не менее четырех символов, то переходим по адресу 00401163. Посмотри, все, что ниже, - это генерация регистрационного кода. Она продолжается вплоть до 0040126A, а дальше программа ставит в обратном порядке цифры в коде. Эта процедура длится до 00401286. Теперь откроем любой текстовый редактор, выделим весь код от 00401163 до 00401286 и скопируем его. Не торопись очищать скопированное от лишнего хлама, нам еще понадобятся адреса переходов, чтобы расставить метки, чем мы далее и займемся. Во всех строках, где есть условные и безусловные переходы, указаны адреса, по которым эти переходы осуществляются. По адресу 00401192, допустим, - это 00401196. Мы сделаем его первой меткой. Вместо «JNZ SHORT crackme.00401196» пишем «JNZ SHORT metka1». А на строчку выше адреса 00401196 пишем «metka1:». Названия меток для нас не имеют никакого значения, линковщик подставит вместо них адреса, по которым они находятся. Меняем все переходы на метки с названиями metka1, meka2, metka3 и т.д. Всего должно получиться 15 меток. Теперь приведем функции lstrlenA в читаемый вид (lstrlenA возвращает в eax количество символов указанной строки). У этой функции есть один-единственный параметр, который указывает на адрес строки, количество символов которой нам требуется получить. Если посмотреть строчку над функцией, можно заметить, что в первом случае мы передаем длину имени, которое находится по адресу 00406349, а во втором – сгенерированный номер, который находится по адресу 00406549. Передавать функции адреса в чистом виде не имеет смысла, потому как по ним может находиться все что угодно. А вот подставить свои переменные мы имеем полное право. Назовем имя пользователя - UserName, а регистрационный номер - RegNumber. Сначала просто подставим их в функции, а объявлять будем потом: |