Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #79, ИЮЛЬ 2005 г.

Лекарство для CuteFTP

EGOiST/TSRh (egoist_tsrh@bk.ru)

Хакер, номер #079, стр. 079-062-4


[проверка введенного серийника]

mov eax, [edx]

mov ecx, [edx+4]

mov dword ptr [esp+24h+var_20], eax

mov eax, [edx+8]

mov [esp+24h+var_1C], ecx

mov cx, [edx+0Ch]

lea edx, [esp+24h+var_20]

push esi

push edx ; char *

mov [esp+2Ch+var_18], eax

mov [esp+2Ch+var_14], cx

call __strupr

lea eax, [esp+2Ch+var_20]

push eax

call sub_4726E0

mov esi, eax

push esi

call sub_4723D0

lea ecx, [esp+34h+var_10]

mov edi, eax

push ecx

push esi

mov [esp+3Ch+var_10], 0

call sub_472560

lea edx, [esp+3Ch+var_20]

push 0Eh ; size_t

lea eax, [esp+40h+var_10]

push edx ; char *

push eax ; char *

call __strnicmp

add esp, 20h

test eax, eax

pop esi

jnz short loc_476C8B

Сейчас самое время развернуть IDA и попутно заглядывать в нее. Чтобы перейти на какой-нибудь адрес в IDA, нужно нажать G. До вызова call __strupr наш серийник копируется в буфер, а потом посредством __strupr все символы переводятся в верхний регистр. Далее заходим в sub_4726e0:

if serial[0] == 'A'

mov edi, [esp+arg_0]

xor esi, esi

cmp byte ptr [edi], 41h

jz short loc_4726F2

pop edi

xor eax, eax

pop esi

retn

Тут с самого начала проверяется первый символ серийника, и он должен быть равен "A" (0x41). Удаляем старый бряк bc 0046eaf5 и ставим новый bp 00476c44. Пускаем прогу, нажимая F9, меняем serial, чтобы первый символ был "A", и жмем Next. Далее в sub_4723d0 идут всяческие преобразования серийника, а вот в sub_472560 из всего этого генерится правильный код, который затем сравнивается в __strnicmp. Таким образом, дойдя до 00476c6e и введя команду d eax, мы увидим в окне дампа правильный номер :). Сравнение правильного и неправильного серийников в открытом виде — это самая распространенная ошибка кодеров.

Тут, казалось бы, надо остановиться и написать кейген, но давай посмотрим, что будет дальше. Запоминаем правильный serial, который для тебя был сгенерирован «заботливым» кодером. Пускаем прогу по F9, вводим новые данные, жмем Next. Ах да, сработает установленный бряк. Сотрем его командой bс 00476c44 и опять нажмем F9. О чудо! Программа приняла номер, однако радоваться еще рано. Софтина просит ввести инфу для верификации серийника. Оставь все как есть и жми Next. Тут происходит самое неприятное: программа начинает стучаться на сервер dbregistration.globalscape.com, чтобы проверить введенный код. Ну что же, позволим ей подключиться к серверу и выполнить верификацию серийного номера. Разумеется, наш serial не будет принят системой и возникнет уже знакомая ошибка, а программа попросит ввести другой номер. Не беда, сейчас это исправим!

Конечно, тут можно поставить http-сервер с php, написать несколько строк в ответ на запрос проги и обмануть ее. Но автор предусмотрел это: запрос передается в зашифрованном виде, и разглядеть, каким образом он составляется, не так уж просто. Конечно, можно вычислить алгоритм шифрования и реализовать этот прием, но мы с тобой оставим эту экзотику для любителей и пойдем строго прямо, потому что иногда это единственный логический выход :).

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