Blog. Just Blog

Исследование защиты программы PictureCode Photo Ninja

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

PictureCode Photo Ninja - профессиональный RAW-конвертер для множества фотокамер, пакетный редактор цифровых изображений с различными эффектами, такими как подавление шумов, исправление экспозиции, повышение четкости, коррекция дисторсии объектива, а также уникальный инструмент восстановления пересвеченных участков изображений. Но за весь этот кайф надо выложить целую кучу бабла. Или не выложить, смотря как подойти к этому вопросу.

Скачиваем дистрибутив, устанавливаем, запускаем. Триального срока нет, но основное ограничение незарегистрированной версии заключается в том, что обработанные изображения невозможно сохранить.

Сообщение незарегистрированной программы
Сообщение незарегистрированной программы

Исполняемый файл ничем не упакован и не защищен, отправляем его в дизассемблер. Когда дизассемблер закончит работу, поищем в файле текст сообщения, которое появляется при отсутствии регистрации.

Текст сообщения об отсутствии регистрации
Текст сообщения об отсутствии регистрации

Мы видим начало фразы, а чуть выше - несколько вариантов ее продолжения. Это отсутствующая или неправильная лицензия, просроченная лицензия и устаревшая лицензия. Примерный фронт работы понятен, переходим к дизассемблеру.
  1. .text:00790D5B                 push    edi
  2. .text:00790D5C                 xor     ebx, ebx
  3. .text:00790D5E                 push    ebx
  4. .text:00790D5F                 mov     [esp+28h+var_10], ebx
  5. .text:00790D63                 mov     esi, [esp+28h+arg_0]
  6. .text:00790D67                 push    offset aPThisOperation
  7. ; "<p>This operation is unavailable becaus"...
  8. .text:00790D6C                 push    esi
  9. .text:00790D6D                 mov     [esp+30h+var_4], ebx
  10. .text:00790D71                 call    ds:?tr@QObject@@SA?AVQString@@PBD0@Z
  11. .text:00790D77                 add     esp, 0Ch
  12. .text:00790D7A                 mov     ebp, ds:?free@QString@@CAXPAUData@1@@Z
  13. .text:00790D80                 mov     edi, 1
  14. .text:00790D85                 mov     [esp+24h+var_4], ebx
  15. .text:00790D89                 mov     [esp+24h+var_10], edi
  16. .text:00790D8D                 push    ebx
  17. .text:00790D8E                 cmp     byte_A56494, bl
  18. .text:00790D94                 jnz     short loc_790DB2
  19. .text:00790D96                 lea     eax, [esp+28h+var_14]
  20. .text:00790D9A                 push    offset aYourLicenseIsI
  21. ; "your license is invalid.</p>"
  22. .text:00790D9F                 push    eax
  23. .text:00790DA0                 call    ds:?tr@QObject@@SA?AVQString@@PBD0@Z
  24. .text:00790DA6                 add     esp, 0Ch
  25. .text:00790DA9                 mov     [esp+24h+var_4], edi
  26. .text:00790DAD                 jmp     loc_790E60
  27. .text:00790DB2 ; --------------------------------------------------
  28. .text:00790DB2 loc_790DB2:
  29. .text:00790DB2                 cmp     byte_A56495, bl
  30. .text:00790DB8                 jz      short loc_790DFF
  31. .text:00790DBA                 lea     ecx, [esp+28h+var_14]
  32. .text:00790DBE                 push    offset aYourLicenseKey
  33. ; "your license key has expired.</p>"
  34. .text:00790DC3                 push    ecx
  35. .text:00790DC4                 call    ds:?tr@QObject@@SA?AVQString@@PBD0@Z
  36. .text:00790DCA                 add     esp, 0Ch
  37. .text:00790DCD                 mov     edi, ds:?append@QString@@QAEAAV1@ABV1@@Z
  38. .text:00790DD3                 push    eax
  39. .text:00790DD4                 mov     ecx, esi
  40. .text:00790DD6                 mov     [esp+28h+var_4], 2
  41. .text:00790DDE                 call    edi
  42. .text:00790DE0                 mov     edx, [esp+24h+var_14]
  43. .text:00790DE4                 mov     byte ptr [esp+24h+var_4], bl
  44. .text:00790DE8                 or      eax, 0FFFFFFFFh
  45. .text:00790DEB                 lock xadd [edx], eax
  46. .text:00790DEF                 jnz     loc_790E86
  47. .text:00790DF5                 mov     ecx, [esp+24h+var_14]
  48. .text:00790DF9                 push    ecx
  49. .text:00790DFA                 jmp     loc_790E81
  50. .text:00790DFF ; -------------------------------------------------
  51. .text:00790DFF loc_790DFF:
  52. .text:00790DFF                 cmp     byte_A56496, bl
  53. .text:00790E05                 jz      short loc_790E45
  54. .text:00790E07                 lea     edx, [esp+28h+var_14]
  55. .text:00790E0B                 push    offset aYourLicenseK_0
  56. ; "your license key is too old for this ve"...
  57. .text:00790E10                 push    edx
  58. .text:00790E11                 call    ds:?tr@QObject@@SA?AVQString@@PBD0@Z
  59. .text:00790E17                 add     esp, 0Ch
  60. .text:00790E1A                 mov     edi, ds:?append@QString@@QAEAAV1@ABV1@@Z
  61. .text:00790E20                 push    eax
  62. .text:00790E21                 mov     ecx, esi
  63. .text:00790E23                 mov     [esp+28h+var_4], 3
  64. .text:00790E2B                 call    edi
  65. .text:00790E2D                 mov     eax, [esp+24h+var_14]
  66. .text:00790E31                 mov     byte ptr [esp+24h+var_4], bl
  67. .text:00790E35                 or      ecx, 0FFFFFFFFh
  68. .text:00790E38                 lock xadd [eax], ecx
  69. .text:00790E3C                 jnz     short loc_790E86
  70. .text:00790E3E                 mov     edx, [esp+24h+var_14]
  71. .text:00790E42                 push    edx
  72. .text:00790E43                 jmp     short loc_790E81
  73. .text:00790E45 ; ---------------------------------------------------
  74. .text:00790E45 loc_790E45:
  75. .text:00790E45                 lea     eax, [esp+28h+var_14]
  76. .text:00790E49                 push    offset aYouHaveNotInst
  77. ; "you have not installed a valid license "...
  78. .text:00790E4E                 push    eax
  79. .text:00790E4F                 call    ds:?tr@QObject@@SA?AVQString@@PBD0@Z
  80. .text:00790E55                 add     esp, 0Ch
  81. .text:00790E58                 mov     [esp+24h+var_4], 4
  82. .text:00790E60
Из всей массы кода интерес представляют только следующие проверки:
  1. ...
  2. .text:00790D8E                 cmp     byte_A56494, bl
  3. .text:00790D94                 jnz     short loc_790DB2
  4. ...
  5. .text:00790DB2                 cmp     byte_A56495, bl
  6. .text:00790DB8                 jz      short loc_790DFF
  7. ...
  8. .text:00790DFF                 cmp     byte_A56496, bl
  9. .text:00790E05                 jz      short loc_790E45
  10. ...
Почему именно они? Присмотритесь повнимательнее, от их значений зависят варианты "неправильности" лицензии. Логично предположить, что какая-то комбинация должна означать, что программа зарегистрирована. Посмотрим, где, как и какими значениями инициализируются эти байты. По перекрестным ссылкам выходим на следующий код:
  1. .text:00790CF0 sub_790CF0      proc near 
  2. .text:00790CF0 arg_0           = byte ptr  4
  3. .text:00790CF0 arg_4           = byte ptr  8
  4. .text:00790CF0 arg_8           = byte ptr  0Ch
  5. .text:00790CF0                 mov     al, [esp+arg_0]
  6. .text:00790CF4                 mov     cl, [esp+arg_4]
  7. .text:00790CF8                 mov     dl, [esp+arg_8]
  8. .text:00790CFC                 mov     byte_A56494, al
  9. .text:00790D01                 mov     byte_A56495, cl
  10. .text:00790D07                 mov     byte_A56496, dl
  11. .text:00790D0D                 retn
  12. .text:00790D0D sub_790CF0      endp
В функцию через стек передаются три параметра, которыми инициализируются эти байты. Раскручиваем цепочку дальше, переходим к месту, откуда эта функция инициализации вызывается.
  1. .text:004F7531                 cmp     byte ptr [esi+10h], 0
  2. .text:004F7535                 jz      short loc_4F754B
  3. .text:004F7537                 cmp     byte ptr [esi+11h], 0
  4. .text:004F753B                 jnz     short loc_4F754B
  5. .text:004F753D                 cmp     byte ptr [esi+12h], 0
  6. .text:004F7541                 jnz     short loc_4F754B
  7. .text:004F7543                 mov     ecx, [ebx+3Ch]
  8. .text:004F7546                 call    sub_7552B0
  9. .text:004F754B loc_4F754B:
  10. ; Заполнить регистры значениями из ячеек памяти
  11. .text:004F754B                 movzx   edx, byte ptr [esi+12h]
  12. .text:004F754F                 movzx   eax, byte ptr [esi+11h]
  13. .text:004F7553                 movzx   ecx, byte ptr [esi+10h]
  14. ; Записать их в стек
  15. .text:004F7557                 push    edx
  16. .text:004F7558                 push    eax
  17. .text:004F7559                 push    ecx
  18. ; Вызвать функцию инициализации
  19. .text:004F755A                 call    sub_790CF0
Вот тут находится самое интересное. У нас есть три значения в ячейках памяти и три байта, которые инициализируются этими значениями. Смотрим проверки и условные переходы, предшествующие инициализации. Если первый байт нулевой, то дальнейшие проверки не выполняются. Как мы помним из кода, приведенного выше, от этих значений зависит вариант незарегистрированности программы. Две последующие проверки порождают условные переходы на тот же адрес, что и первый. То есть, если хоть одно условие выполняется, то это означает, что программа незарегистрирована. Значит, чтобы ни одно условие незарегистрированности не выполнилось, первый байт должен иметь значение 1, а два следующих - 0. Пропатчим условия проверки, заменив команды CMP на MOV с предварительной инициализацией нужными значениями. Условные переходы при этом надо удалить. Результат проще посмотреть на скриншоте:

Патчим код
Патчим код

Записываем изменения в исполняемый файл, запускаем программу. Все ограничения пропали, отредактированные изображения можно сохранять. В очередной раз мы сэкономили кучу денег и, возможно, научились чему-нибудь новому.

Поделиться ссылкой ВКонтакте
Просмотров: 6347 | Комментариев: 4

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

Комментарии

Отзывы посетителей сайта о статье
razgon (29.10.2013 в 21:00):
здравствуйте! я не программист к сожалению, пытася проделать сии операции по вашим картинкам, ничего не вышло(((
помогите пожалуйста.
ManHunter (02.10.2013 в 11:14):
Потому же, что и десятки единиц другого софта - за нее просили денег :) Из всех функций программы пользуюсь только одной, ниндзя действительно неплохо вытягивает пересвеченные участки изображения. Дисторсия исправляется в DxO ViewPoint, ББ изумительно выправляется в Helicon Filter, резкость повышается в Фотошопе, шумы убираются в Noiseware, кроп и подбор кадров делается в XnView, ну и так далее. Не утверждаю, что это оптимально по скорости, но это дело привычки, а мне их менять уже поздно.
Never (02.10.2013 в 11:09):
Почему она? Как в сравнении с лайтрумом?
brute (30.09.2013 в 20:41):
сам бы не справился: пытался патчить непосредственно проверки bl, но что-то не получалось..
п.с. программа топорная, интерфейс неюзабельный - даже под другим именем файл пересохранить нельзя.

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

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

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