Хакер vs Шаровары

FINNAN (finnan@mail.ru)

Xakep, номер #022, стр. 022-060-5


Хм, теперь прога ломится к себе на сервак, не иначе как проверить ту лабуду, что ты ввел. Видимо, догадывается, что ее кидают ;). Ну что ж, уже кое-что!

Отхлебнули пива, поехали дальше.

Как уже выяснилось, команда [0167:00489AB9 CALL 004AB0E0] вызывает функцию, которая проверяет SN и RegName. Значит надо подробно исследовать ее. Трассируем по F8 и попадаем в тело функции. Вот ее урезанный код:

:0167:004AB0E0 SUB ESP,20

:0167:004AB0E3 OR ECX,-01

:0167:004AB0E6 XOR EAX,EAX

:0167:004AB0E8 PUSH ESI

:0167:004AB0E9 MOV ESI,[ESP+2C]

:0167:004AB0ED PUSH EDI

:0167:004AB0EE MOV EDI,ESI

:0167:004AB0F0 REPNZ SCASB

:0167:004AB0F2 NOT ECX

:0167:004AB0F4 DEC ECX

:0167:004AB0F5 CMP ECX,0E -\

:0167:004AB0F8 JNZ 004AB16D - Проверка длины SN

..............

..............

Если длина не 14, то вылетаем без лишних вычислений

:0167:004AB16D MOV ECX,[ESP+2C]

:0167:004AB171 POP EDI

:0167:004AB172 XOR AX,AX

:0167:004AB175 POP ESI

:0167:004AB176 MOV DWORD PTR [ECX],FFFFFFFF

:0167:004AB17C ADD ESP,20

:0167:004AB17F RET

Обрати внимание на строки 004AB0F0 - 004AB0F8: (если ты не знаешь, как работает команда REPNZ SCASB, почитай доки по ASM-у). Этот код проверяет длину SN и, если окажется, что длина не равна 0Eh (т.е. 14), то посылает в обломинск сразу. Теперь имеет смысл вводить не 0987654321, а 09876543211234. Продолжаем исследовать дальше.

Функция 004AB0E0 после проверки длины SN вызывает еще 6 функций. Как мне удалось выяснить, первые пять из них вычисляют реальный серийный номер, а последняя сравнивает его со введенным. Нас интересует последняя функция, находящаяся по адресу 004B04D0. Она начинается так:

:0167:004B04D0 PUSH EBP

:0167:004B04D1 MOV EBP,ESP

:0167:004B04D3 PUSH EDI

:0167:004B04D4 PUSH ESI

:0167:004B04D5 PUSH EBX

:0167:004B04D6 MOV ECX,[EBP+10]

:0167:004B04D9 OR ECX,ECX

:0167:004B04DB JZ 004B05CA

:===>:004B04E1 MOV ESI,[EBP+08]

:===>:004B04E4 MOV EDI,[EBP+0C]

:0167:004B04E7 LEA EAX,[005456E4]

:0167:004B04ED CMP DWORD PTR [EAX+08],00

Обрати внимание: этой функции передаются через стек два параметра, которые почти сразу заносятся в регистры ESI и EDI. Наверняка это указатели на что-то в памяти. Чтобы посмотреть на что, оттрассируй до строчки [:0167:004B04E7 LEA EAX,[005456E4]] и введи команды:

DB EDI

DB ESI

Хм. По адресу, находящемуся в EDI, лежит введенный SN (т.е. 09876543211234), а по адресу в ESI - странная последовательность - A2222222222222. Ее длина - 14 символов, и я почти уверен, что это сгенерированный SN, тем более данная функция сравнивает эти последовательности, и если они окажутся одинаковыми, то, по-видимому, ты станешь счастливым обладателем зарегистрированной программы. Что-то мне подсказывает, что SN не может быть таким, но первый символ его - 'A' стопудово. Так давай поставим BP на строчку [:0167:004B04E7 LEA EAX,[005456E4]], попытаемся ввести A9876543211234 и посмотрим, что сгенерит программа для себе (ну и для нас, естественно ;) ).

Назад на стр. 022-060-4  Содержание  Вперед на стр. 022-060-6