
Исследование защиты программы Kuliba TrayPicker

Скриншот программы Kuliba TrayPicker
Программа Kuliba TrayPicker предназначена для получения кода цвета пиксела под курсором. Несмотря на огромное количество бесплатных аналогов, причем с гораздо более широким функционалом, автор почему-то решил сделать свою программу платной. Офсайт теперь недоступен, ни скачать, ни купить программу уже нельзя. Достойный итог.
Забираем с файлообменника дистрибутив, устанавливаем, смотрим. При старте и выходе из программы появляется окно с предложением метнуться в кассу или продолжить работу. Причем у автора явно был только один монитор, так как позиция для отображения этого окна считается очень криво. На ввод левых регистрационных данных программа реагирует следующим сообщением:

Сообщение о неправильной регистрации
Отправим основной исполняемый файл в дизассемблер и посмотрим, где и при каких условиях это сообщение появляется.
Code (Assembler) : Убрать нумерацию
- CODE:0050D89D mov eax, [ebp+var_4]
- ; Вызвать функцию проверки
- CODE:0050D8A0 call sub_4FCAFC
- ; Если AL!=0, то введенный серийный номер правильный
- CODE:0050D8A5 test al, al
- CODE:0050D8A7 jnz short loc_50D8D6
- CODE:0050D8A9 inc ebx
- CODE:0050D8AA cmp ebx, 6
- CODE:0050D8AD jge short loc_50D8BB
- CODE:0050D8AF mov eax, offset _str_Sorry__registra.Text
- CODE:0050D8B4 call @Dialogs@ShowMessage
- ; Dialogs::ShowMessage(System::AnsiString)
- CODE:0050D8B9 jmp short loc_50D8CA
- CODE:0050D8BB ; --------------------------------------
- CODE:0050D8BB loc_50D8BB:
- ; Если было более 6 попыток неудачной регистрации, то выйти из программы
- CODE:0050D8BB mov eax, offset _str_Sorry__your_att.Text
- CODE:0050D8C0 call @Dialogs@ShowMessage
- ; Dialogs::ShowMessage(System::AnsiString)
- CODE:0050D8C5 call @System@@Halt0$qqrv
- ; System::__linkproc__ Halt0(void)
- CODE:0050D8CA ; --------------------------------------
- CODE:0050D8CA loc_50D8CA:
- ; Записать данные в реестр
- CODE:0050D8CA mov eax, [ebp+var_4]
- CODE:0050D8CD call sub_4FCAFC
- CODE:0050D8D2 test al, al
- CODE:0050D8D4 jz short loc_50D87A
- CODE:0050D8D6 loc_50D8D6:
- CODE:0050D8D6 mov eax, ds:dword_51BC98
- CODE:0050D8DB add eax, 0A8h
- CODE:0050D8E0 mov edx, [ebp+var_4]
- CODE:0050D8E3 call @System@@LStrAsg$qqrpvpxv
- ; System::__linkproc__ LStrAsg(void *,void *)
- CODE:0050D8E8 mov ecx, offset _str_Client_1.Text
- CODE:0050D8ED mov edx, offset _str_Software_Kuliba_1.Text
- CODE:0050D8F2 mov eax, ds:dword_51BC98
- CODE:0050D8F7 call sub_4FC67C
- CODE:0050D8FC mov eax, [esi+498h]
- ; Убрать из меню пункт регистрации
- CODE:0050D902 xor edx, edx
- CODE:0050D904 call @Menus@TMenuItem@SetVisible$qqro
- ; Menus::TMenuItem::SetVisible(bool)
- CODE:0050D909 mov eax, offset _str_Thank_you_for_b.Text
- ; Сообщение об успешной регистрации
- CODE:0050D90E call @Dialogs@ShowMessage
- ; Dialogs::ShowMessage(System::AnsiString)
- CODE:0050D913 xor eax, eax
Code (Assembler) : Убрать нумерацию
- CODE:004FCAFC sub_4FCAFC proc near
- CODE:004FCAFC push ebp
- CODE:004FCAFD mov ebp, esp
- CODE:004FCAFF add esp, 0FFFFFFF0h
- CODE:004FCB02 push ebx
- CODE:004FCB03 push esi
- CODE:004FCB04 xor edx, edx
- CODE:004FCB06 mov [ebp+var_10], edx
- CODE:004FCB09 mov [ebp+var_C], edx
- CODE:004FCB0C mov esi, eax
- CODE:004FCB0E xor eax, eax
- CODE:004FCB10 push ebp
- CODE:004FCB11 push offset loc_4FCB92
- CODE:004FCB16 push dword ptr fs:[eax]
- CODE:004FCB19 mov fs:[eax], esp
- CODE:004FCB1C xor ebx, ebx
- CODE:004FCB1E lea edx, [ebp+var_C]
- CODE:004FCB21 mov eax, esi
- CODE:004FCB23 call @Sysutils@Trim$qqrx17System@AnsiString
- ; Sysutils::Trim(System::AnsiString)
- CODE:004FCB28 mov eax, [ebp+var_C]
- CODE:004FCB2B call sub_404440
- CODE:004FCB30 cmp eax, 2
- CODE:004FCB33 jl short loc_4FCB77
- CODE:004FCB35 lea edx, [ebp+var_10]
- CODE:004FCB38 mov eax, esi
- CODE:004FCB3A call @Sysutils@Trim$qqrx17System@AnsiString
- ; Sysutils::Trim(System::AnsiString)
- CODE:004FCB3F mov eax, [ebp+var_10]
- CODE:004FCB42 lea ecx, [ebp+var_8]
- CODE:004FCB45 lea edx, [ebp+var_4]
- CODE:004FCB48 call sub_4FC9EC
- CODE:004FCB4D mov esi, 3E8h
- CODE:004FCB52 mov eax, offset unk_515C24
- CODE:004FCB57 mov edx, offset unk_516BC4
- CODE:004FCB5C loc_4FCB5C:
- CODE:004FCB5C mov ecx, [ebp+var_4]
- CODE:004FCB5F cmp ecx, [eax]
- CODE:004FCB61 jnz short loc_4FCB6E
- CODE:004FCB63 mov ecx, [ebp+var_8]
- CODE:004FCB66 cmp ecx, [edx]
- CODE:004FCB68 jnz short loc_4FCB6E
- CODE:004FCB6A mov bl, 1
- CODE:004FCB6C jmp short loc_4FCB77
- CODE:004FCB6E ; ------------------------------
- CODE:004FCB6E loc_4FCB6E:
- CODE:004FCB6E add edx, 4
- CODE:004FCB71 add eax, 4
- CODE:004FCB74 dec esi
- CODE:004FCB75 jnz short loc_4FCB5C
- CODE:004FCB77 loc_4FCB77:
- CODE:004FCB77 xor eax, eax
- CODE:004FCB79 pop edx
- CODE:004FCB7A pop ecx
- CODE:004FCB7B pop ecx
- CODE:004FCB7C mov fs:[eax], edx
- CODE:004FCB7F push offset loc_4FCB99
- CODE:004FCB84 loc_4FCB84:
- CODE:004FCB84 lea eax, [ebp+var_10]
- CODE:004FCB87 mov edx, 2
- CODE:004FCB8C call @System@@LStrArrayClr$qqrpvi
- CODE:004FCB91 retn
- CODE:004FCB92 ; ------------------------------
- CODE:004FCB92 loc_4FCB92:
- CODE:004FCB92 jmp unknown_libname_59
- CODE:004FCB97 ; ------------------------------
- CODE:004FCB97 jmp short loc_4FCB84
- CODE:004FCB99 ; ------------------------------
- CODE:004FCB99 loc_4FCB99:
- CODE:004FCB99 mov eax, ebx
- CODE:004FCB9B pop esi
- CODE:004FCB9C pop ebx
- CODE:004FCB9D mov esp, ebp
- CODE:004FCB9F pop ebp
- CODE:004FCBA0 retn
- CODE:004FCBA0 sub_4FCAFC endp
Но патчить пока ничего не будем. Что интересно, корректность регистрационного кода проверятся только в момент его ввода, а при запуске программы проверяется только факт наличия соответствующей записи в реестре. Об этом говорят перекрестные ссылки на функцию проверки серийника, они все идут из обработчика формы ввода. Поставим в отладчике точку останова по адресу 0050D8A7 аккурат за функцией проверки серийника. Повторяем регистрацию с левыми данными, дожидаемся срабатывания точки останова, затем в пошаговом режиме доходим до условного перехода и меняем значение флага ZF на противоположное, чтобы условный переход вывел нас на ветку корректной регистрации. Программа выводит благодарочку, после чего можно закрывать отладчик. Снова запускаем программу, но уже в обычном режиме. Никаких триальных окон не появляется, пункт регистрации в контекстном меню пропал, все работает как надо.
Таким образом регистрация сводится к созданию reg-файла со следующим содержанием
REGEDIT4
[HKEY_CURRENT_USER\Software\Kuliba, Inc.\Color TrayPicker\1.0\Client]
"RegisterKey"="1223434655678678"
и внесением его в реестр на компьютере, где будет установлена программа. Цель достигнута. Можете убирать очередной инструмент в свою софтовую копилку. Хотя лично я бы этого делать не стал, в этой программе очень уж все коряво работает.
Просмотров: 1100 | Комментариев: 1
Метки: исследование защиты

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

Добавить комментарий
Заполните форму для добавления комментария

Попадался редактор тегов mp3 того же авторства, 2008 года,
там бестолково сделано редактирование id3v1 и id3v2
- непонятно, что куда пишется. И аспротект поверх.
Ну и кануло оно всё уже давно.