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


Что же видно в окне данных, как не имя, которое мы ввели? =) А теперь
взглянем на кусок кода под вышеприведенным:

PUSH 00 ; (не интересно)
PUSH 00 ; (не интересно)
PUSH 000003F6 ; Идентификатор управления
MOV EDI, 0040A680 ; Адрес буфера
PUSH ESI ; Идентификатор окна диалога
CALL [User32!GetDlgItemInt]

Функция GetDlgItemInt похожа на GetDlgItemTextA, но возвращает не строку,
а целое число. Она возвращает его в регистре EAX, поэтому мы трассируем
этот код (F10) и смотрим, что же у нас появилось в окне регистров после
вызова функции... В моем случае оно выглядит так:

EAX=00003039

А что такое шестнадцатеричное 3039? Наберем:

:? 3039

И получим следующее:

00003039 0000012345 "09"
^ hex ^ dec ^ ascii

Как Вы видите (и, возможно, уже догадались) это код, который Вы ввели
в диалоговом окне. Ok, что теперь? Посмотрим дальше:

MOV [0040A548], EAX ; Сохраняет рег. код
MOV EDX, EAX ; А также помещает его в EDX


3.1.3 Подсчитывание регистрационного кода
=========================================
Мы достигли места, где подсчитывается реальный регистрационный код!

MOV ECX, FFFFFFFF ; Эти строчки подсчитывают
SUB EAX, EAX ; длину строки
REPNZ SCASB ; .
NOT ECX ; .
DEC ECX ; ECX теперь содержит длину
MOVSX EAX, BYTE PTR [0040A680] ; Получает байт по адр. 40A680h
IMUL ECX, EAX ; ECX = ECX * EAX
SHL ECX, 0A ; Сдвиг влево на 0Ah бит
ADD ECX, 0002F8CC ; Добавляет 2F8CC к результату
MOV [0040A664], ECX

...И где он проверяется