"ED!SON (пер. Mr.Boco). Как ломать программы Windows" - читать интересную книгу автора

Поэтому мы пошагово трассируем программу при помощи F10 до тех пор, пока
не встретим что-нибудь о EBP-34. Не пройдет и нескольких секунд, как Вы
наткнетесь на следующий код:

> LEA EAX, [EBP+FFFFFF64] ; EAX = EBP-9C
LEA ECX, [EBP-34] ; ECX = EBP-34
PUSH EAX ; Сохраняет EAX
PUSH ECX ; Сохраняет ECX
> CALL 00403DD0 ; Вызывает функцию
ADD ESP, 08 ; Удаляет сохраненную информацию
TEST EAX, EAX ; Проверяет значение функции
JNZ 00402BC0 ; Прыгает, если не "ноль"

Мне кажется, что это выглядит как вызов функции сравнения двух строк.
Эта функция работает так: на входе - две строки, на выходе - 0, если
они равны и любое другое значание, если не равны.

А зачем программе сравнивать какую-то строчку с той, что Вы ввели в окне
диалога? Да затем, чтобы проверить правильность Вашей строки (как Вы,
возможно, уже догадались)! Так-так, значит этот номер скрывался по адресу
[EBP+FFFFFF64]? SoftICE не совсем корректно работает с отрицательными
числами и поэтому настоящий адрес следует посчитать:

100000000 - FFFFFF64 = 9C

Вы можете сделать это вычисление прямо в SoftICE:

:? 0-FFFFFF64

Число 100000000 слишком велико для SoftICE, а вычитание из 0 дает тот же
самый результат.

Наконец пришло время взглянуть, что же скрывается по адресу EBP-9C...

:d ebp-9c

В окне данных SoftICE Вы видите длинную строчку цифр - это серийный номер!
Но Вы помните, что я говорил Вам раньше? Два типа регистрации - два разных
серийных номера. Поэтому после того, как Вы записали на бумажечку первый
серийный номер, продолжайте трассировать программу при помощи F10. Мы
дошли до следующего куска кода:

> LEA EAX, [EBP-68] ; EAX = EBP-68
LEA ECX, [EBP-34] ; ECX = EBP-34
PUSH EAX ; Сохраняет EAX
PUSH ECX ; Сохраняет ECX
> CALL 00403DD0 ; Снова вызывает функцию
ADD ESP, 08 ; Удаляет сохраненную информацию
TEST EAX, EAX ; Проверяет значение функции
JNZ 00402BFF ; Прыгает если не "ноль"