ЖУРНАЛ ХАКЕР

SoftIce для начинающих

Программа, которая может все

Xakep, номер #035, стр. 035-053-4


MOVE ESI, ECX ; ...

PUSH 32 ; Макс. длина строки

> PUSH EAX ; Адрес текстового буфера

PUSH 000003F4 ; Идентификатор управления

PUSH DWORD PTR [ESI+1C] ; Идентификатор окна диалога

CALL [USER32!GetDlgItemTextA] ; Получить текст

Команды PUSH означают сохранение значений для последующего использования. Я пометил важные строчки символом '>'. Глядя на этот код, мы видим, что адрес текстового буфера хранился в регистре EAX и что EAX был EBP-34h. Поэтому стоит взглянуть на EBP-34h ":d ebp-34". Ты должен увидеть текст, который ввел в диалоговом окне. Теперь ты должен найти место, где твой номер сравнивается с реальным серийным номером. Поэтому мы пошагово трассируем программу при помощи 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 ; Удаляет сохраненную информацию

Назад на стр. 035-053-3  Содержание  Вперед на стр. 035-053-5