Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Kuliba TrayPicker
Скриншот программы Kuliba TrayPicker

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

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

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Отправим основной исполняемый файл в дизассемблер и посмотрим, где и при каких условиях это сообщение появляется.
  1. CODE:0050D89D                 mov     eax, [ebp+var_4]
  2. ; Вызвать функцию проверки
  3. CODE:0050D8A0                 call    sub_4FCAFC
  4. ; Если AL!=0, то введенный серийный номер правильный
  5. CODE:0050D8A5                 test    al, al
  6. CODE:0050D8A7                 jnz     short loc_50D8D6
  7. CODE:0050D8A9                 inc     ebx
  8. CODE:0050D8AA                 cmp     ebx, 6
  9. CODE:0050D8AD                 jge     short loc_50D8BB
  10. CODE:0050D8AF                 mov     eax, offset _str_Sorry__registra.Text
  11. CODE:0050D8B4                 call    @Dialogs@ShowMessage
  12. ; Dialogs::ShowMessage(System::AnsiString)
  13. CODE:0050D8B9                 jmp     short loc_50D8CA
  14. CODE:0050D8BB ; --------------------------------------
  15. CODE:0050D8BB loc_50D8BB:
  16. ; Если было более 6 попыток неудачной регистрации, то выйти из программы
  17. CODE:0050D8BB                 mov     eax, offset _str_Sorry__your_att.Text
  18. CODE:0050D8C0                 call    @Dialogs@ShowMessage
  19. ; Dialogs::ShowMessage(System::AnsiString)
  20. CODE:0050D8C5                 call    @System@@Halt0$qqrv
  21. ; System::__linkproc__ Halt0(void)
  22. CODE:0050D8CA ; --------------------------------------
  23. CODE:0050D8CA loc_50D8CA:
  24. ; Записать данные в реестр
  25. CODE:0050D8CA                 mov     eax, [ebp+var_4]
  26. CODE:0050D8CD                 call    sub_4FCAFC
  27. CODE:0050D8D2                 test    al, al
  28. CODE:0050D8D4                 jz      short loc_50D87A
  29. CODE:0050D8D6 loc_50D8D6:
  30. CODE:0050D8D6                 mov     eax, ds:dword_51BC98
  31. CODE:0050D8DB                 add     eax, 0A8h
  32. CODE:0050D8E0                 mov     edx, [ebp+var_4]
  33. CODE:0050D8E3                 call    @System@@LStrAsg$qqrpvpxv
  34. ; System::__linkproc__ LStrAsg(void *,void *)
  35. CODE:0050D8E8                 mov     ecx, offset _str_Client_1.Text
  36. CODE:0050D8ED                 mov     edx, offset _str_Software_Kuliba_1.Text
  37. CODE:0050D8F2                 mov     eax, ds:dword_51BC98
  38. CODE:0050D8F7                 call    sub_4FC67C
  39. CODE:0050D8FC                 mov     eax, [esi+498h]
  40. ; Убрать из меню пункт регистрации
  41. CODE:0050D902                 xor     edx, edx
  42. CODE:0050D904                 call    @Menus@TMenuItem@SetVisible$qqro
  43. ; Menus::TMenuItem::SetVisible(bool)
  44. CODE:0050D909                 mov     eax, offset _str_Thank_you_for_b.Text
  45. ; Сообщение об успешной регистрации
  46. CODE:0050D90E                 call    @Dialogs@ShowMessage
  47. ; Dialogs::ShowMessage(System::AnsiString)
  48. CODE:0050D913                 xor     eax, eax
Все более-менее понятно. Вызывается функция проверки введенного серийника, если попытка была неудачной, то увеличивается счетчик попыток, при достижении определенного значения программа закрывается. Если серийник правильный, то данные сохраняются в реестр и выводится сообщение с благодарочкой за покупку. Теперь посмотрим функцию проверки.
  1. CODE:004FCAFC sub_4FCAFC      proc near
  2. CODE:004FCAFC                 push    ebp
  3. CODE:004FCAFD                 mov     ebp, esp
  4. CODE:004FCAFF                 add     esp, 0FFFFFFF0h
  5. CODE:004FCB02                 push    ebx
  6. CODE:004FCB03                 push    esi
  7. CODE:004FCB04                 xor     edx, edx
  8. CODE:004FCB06                 mov     [ebp+var_10], edx
  9. CODE:004FCB09                 mov     [ebp+var_C], edx
  10. CODE:004FCB0C                 mov     esi, eax
  11. CODE:004FCB0E                 xor     eax, eax
  12. CODE:004FCB10                 push    ebp
  13. CODE:004FCB11                 push    offset loc_4FCB92
  14. CODE:004FCB16                 push    dword ptr fs:[eax]
  15. CODE:004FCB19                 mov     fs:[eax], esp
  16. CODE:004FCB1C                 xor     ebx, ebx
  17. CODE:004FCB1E                 lea     edx, [ebp+var_C]
  18. CODE:004FCB21                 mov     eax, esi
  19. CODE:004FCB23                 call    @Sysutils@Trim$qqrx17System@AnsiString
  20. ; Sysutils::Trim(System::AnsiString)
  21. CODE:004FCB28                 mov     eax, [ebp+var_C]
  22. CODE:004FCB2B                 call    sub_404440
  23. CODE:004FCB30                 cmp     eax, 2
  24. CODE:004FCB33                 jl      short loc_4FCB77
  25. CODE:004FCB35                 lea     edx, [ebp+var_10]
  26. CODE:004FCB38                 mov     eax, esi
  27. CODE:004FCB3A                 call    @Sysutils@Trim$qqrx17System@AnsiString
  28. ; Sysutils::Trim(System::AnsiString)
  29. CODE:004FCB3F                 mov     eax, [ebp+var_10]
  30. CODE:004FCB42                 lea     ecx, [ebp+var_8]
  31. CODE:004FCB45                 lea     edx, [ebp+var_4]
  32. CODE:004FCB48                 call    sub_4FC9EC
  33. CODE:004FCB4D                 mov     esi, 3E8h
  34. CODE:004FCB52                 mov     eax, offset unk_515C24
  35. CODE:004FCB57                 mov     edx, offset unk_516BC4
  36. CODE:004FCB5C loc_4FCB5C:
  37. CODE:004FCB5C                 mov     ecx, [ebp+var_4]
  38. CODE:004FCB5F                 cmp     ecx, [eax]
  39. CODE:004FCB61                 jnz     short loc_4FCB6E
  40. CODE:004FCB63                 mov     ecx, [ebp+var_8]
  41. CODE:004FCB66                 cmp     ecx, [edx]
  42. CODE:004FCB68                 jnz     short loc_4FCB6E
  43. CODE:004FCB6A                 mov     bl, 1
  44. CODE:004FCB6C                 jmp     short loc_4FCB77
  45. CODE:004FCB6E ; ------------------------------
  46. CODE:004FCB6E loc_4FCB6E:
  47. CODE:004FCB6E                 add     edx, 4
  48. CODE:004FCB71                 add     eax, 4
  49. CODE:004FCB74                 dec     esi
  50. CODE:004FCB75                 jnz     short loc_4FCB5C
  51. CODE:004FCB77 loc_4FCB77:
  52. CODE:004FCB77                 xor     eax, eax
  53. CODE:004FCB79                 pop     edx
  54. CODE:004FCB7A                 pop     ecx
  55. CODE:004FCB7B                 pop     ecx
  56. CODE:004FCB7C                 mov     fs:[eax], edx
  57. CODE:004FCB7F                 push    offset loc_4FCB99
  58. CODE:004FCB84 loc_4FCB84:
  59. CODE:004FCB84                 lea     eax, [ebp+var_10]
  60. CODE:004FCB87                 mov     edx, 2
  61. CODE:004FCB8C                 call    @System@@LStrArrayClr$qqrpvi
  62. CODE:004FCB91                 retn
  63. CODE:004FCB92 ; ------------------------------
  64. CODE:004FCB92 loc_4FCB92:
  65. CODE:004FCB92                 jmp     unknown_libname_59
  66. CODE:004FCB97 ; ------------------------------
  67. CODE:004FCB97                 jmp     short loc_4FCB84
  68. CODE:004FCB99 ; ------------------------------
  69. CODE:004FCB99 loc_4FCB99:
  70. CODE:004FCB99                 mov     eax, ebx
  71. CODE:004FCB9B                 pop     esi
  72. CODE:004FCB9C                 pop     ebx
  73. CODE:004FCB9D                 mov     esp, ebp
  74. CODE:004FCB9F                 pop     ebp
  75. CODE:004FCBA0                 retn
  76. CODE:004FCBA0 sub_4FCAFC      endp
Код не сильно сложный, но лучше посмотреть все происходящее в отладчике. Берется введенный серийник, от него считается контрольная сумма типа табличной CRC32, причем со вложенностью аж в 2000 проходов, затем полученный результат сравнивается с каждой из 1000 предустановленных контрольных сумм. То есть обратить такой алгоритм практически нереально. Решением будет или патч самого алгоритма проверки, чтобы он возвращал всегда нужное значение, или получение в отладчике CRC под конкретный серийник и замена им одной из предустановленных CRC.

Но патчить пока ничего не будем. Что интересно, корректность регистрационного кода проверятся только в момент его ввода, а при запуске программы проверяется только факт наличия соответствующей записи в реестре. Об этом говорят перекрестные ссылки на функцию проверки серийника, они все идут из обработчика формы ввода. Поставим в отладчике точку останова по адресу 0050D8A7 аккурат за функцией проверки серийника. Повторяем регистрацию с левыми данными, дожидаемся срабатывания точки останова, затем в пошаговом режиме доходим до условного перехода и меняем значение флага ZF на противоположное, чтобы условный переход вывел нас на ветку корректной регистрации. Программа выводит благодарочку, после чего можно закрывать отладчик. Снова запускаем программу, но уже в обычном режиме. Никаких триальных окон не появляется, пункт регистрации в контекстном меню пропал, все работает как надо.

Таким образом регистрация сводится к созданию reg-файла со следующим содержанием

REGEDIT4

[HKEY_CURRENT_USER\Software\Kuliba, Inc.\Color TrayPicker\1.0\Client]
"RegisterKey"="1223434655678678"

и внесением его в реестр на компьютере, где будет установлена программа. Цель достигнута. Можете убирать очередной инструмент в свою софтовую копилку. Хотя лично я бы этого делать не стал, в этой программе очень уж все коряво работает.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 452 | Комментариев: 0

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

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0057 сек.) / Память: 4.75 Mb
Наверх