Крякинг — это просто Степан Ильин aka Step Хакер, номер #080, стр. 080-070-3 [взлом серийника] Запускай W32Dasm, далее меню Dissembler –> Open File и выбирай файл CRACKME1.EXE. Ву-а-ля! Перед тобой полностью дизассемблированный код программы, но и в нем еще нужно разобраться. Наша цель — найти ту часть кода, которая каким-то образом использует обозначенную выше строку. Самый банальный способ — провести поиск строки (меню Search -> Find Next), но есть и другой вариант. Дело в том, что W32Dasm записывает все найденные обращения к строковым данным в специальный список (меню Refs -> String Data References). Поэтому вместо поиска можно просто выбрать из списка нужную строку и дважды кликнуть по ней мышью. Так или иначе, W32Dasm автоматически переведет тебя на следующий код: * Possible StringData Ref from Data Obj ->"Wrong Password! Keep trying, you'll get it!" 004012A2 6845304000 push 00403045 Комментарий указывает на то, что в следующей команде происходит обращение к нужной строке — «Wrong password. Keep trying, you’ll get it!». Разберем эту команду более подробно: 004012A2 — это адрес, по которому в памяти находится данная команда, 6814654100 — представление команды в шестнадцатеричном виде (машинные коды), push 00403045 — непосредственно сама ассемблерная команда. Она помещает в стек адрес 00403045, по которому, судя по комментарию W32Dasm’а, хранится наша строка. По нашему предположению после загрузки адреса строки в стек, происходит вызов функции, выводящей сообщение на экран. Так и есть — смотрим ниже: * Reference To: USER32.MessageBoxA, Ord:01BBh :004012A9 E85C000000 Call 0040130A W32Dasm нам явно указывает, что команда вызова функции Call вызывает именно API-функцию вывода окошка (MessageBoxA). Теперь смотрим, что происходило до вызова это функции. Сразу бросается в глаза следующий код: 00401291 Call 00401352 00401296 cmp eax, 00000000 00401299 je 004012B0 «Да вот прямо он мне так в глаза и бросился — по-моему, ничем не отличается от всего остального», — возможно, грустно подметишь ты. На самом деле это довольно стандартная конструкция — запомни ее. В 90% случаев это и есть код проверки серийника. Сначала вызывается некоторая процедура, которая сравнивает введенный пользователем и правильный код и по результатам проверки устанавливает нужное значение регистра EAX. После этого с помощью команды CMP производиться сравнение значение регистра с 0. Если они равны (je – jump equal – перейти, если равно), осуществляется переход на адрес 004012B0. Давай посмотрим, что находится по этому адресу — нажми Shift+F12 и в появившемся окошке введи этот адрес. Ого! Появившийся фрагмент кода в точности повторяет код вывода сообщения на экран. Разница лишь в том, что вместо сообщения о неправильном коде, выводится надпись «You got it! Your now a cracker!». Отсюда вывод: вызванная ранее процедура действительно осуществляет проверку серийных кодов. Если пользователь ввел правильный пароль, то значение регистра EAX становится равным 0, и управление передается процедуре вывода сообщения об успехе. В противном случае в регистр EAX записывается 1, и никакого перехода не происходит. Далее по коду расположен вызов MessageBoxA с сообщением об ошибке, который и выполняется. |