Лекарство для 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, написать несколько строк в ответ на запрос проги и обмануть ее. Но автор предусмотрел это: запрос передается в зашифрованном виде, и разглядеть, каким образом он составляется, не так уж просто. Конечно, можно вычислить алгоритм шифрования и реализовать этот прием, но мы с тобой оставим эту экзотику для любителей и пойдем строго прямо, потому что иногда это единственный логический выход :). |