Реферат: Как ломать программы Windows C EDSON UCF, перевод Mr.BocoTCP
Функция 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
...И где он проверяется
CMP ECX, EDX ; Сравнивает числа
JZ 00402DA6 ; Прыгает, если равны
Когда Вы дотрассировали до сравнения чисел, Вы можете посмотреть, каким должен был быть Ваш РЕАЛЬНЫЙ регистрационный код:
:? ecx
В моем случае это дало:
000DC0CC 0000901324