Blog. Just Blog

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

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

PicPick - навороченный комбайн для работы с изображениями. На борту имеется захват экрана, графический редактор, инструмент выбора цвета, цветовая палитра, пиксельная линейка, угломер и многое другое. Готовый файл можно сразу же отправить в облачное хранилище, загрузить на фотохостинг, послать по электронной почте, или залить на FTP. Есть даже бесплатная версия для домашнего использования, но в ней, судя по описанию на офсайте, присутствует реклама. Платная версия рекламу не показывает, но работает в ознакомительном режиме всего 30 дней, что не есть правильно.

Забираем с офсайта дистрибутив платной версии, устанавливаем, смотрим. Основные признаки незарегистрированной версии - окно с предложением активировать вашу копию и характерные надписи в окне "О программе".

Триальное окно
Триальное окно

Окно "О программе"
Окно "О программе"

На первый взгляд главный исполняемый файл ничем не упакован, но в папке с программой обнаруживается файл VMProtectSDK32.dll, который жирненько так намекает на использование защиты VMProtect, а в главном файле при более внимательном осмотре обнаруживаются секции ".vmp0" и ".vmp1", что подтверждает первоначальную догадку. Как бы то ни было, отправляем файл на разбор в дизассемблер.

Строки в файле
Строки в файле

Поиском по файлу обнаруживаем юникодные строчки, которые появляются в окне "О программе". Это строки для триальной версии, зарегистрированной, и еще какой-то с недоступным ключем. Давайте посмотрим в листинге дизассемблера, где и как эти строки используются.
  1. .text:00ECB07A                 push    dword ptr fs:[eax]
  2. .text:00ECB07D                 mov     fs:[eax], esp
  3. .text:00ECB080                 lea     eax, [ebp+var_1C]
  4. ; Вызвать функцию проверки
  5. .text:00ECB083                 call    sub_EC4FF8
  6. ; Сохранить ее результат из EAX в ESI
  7. .text:00ECB088                 mov     esi, eax
  8. .text:00ECB08A                 mov     eax, off_10BA35C
  9. .text:00ECB08F                 mov     eax, [eax]
  10. .text:00ECB091                 mov     [eax], esi
  11. ; Контрольное значение ESI = 2710h ?
  12. .text:00ECB093                 cmp     esi, 2710h
  13. .text:00ECB099                 jnz     loc_ECB123
  14. .text:00ECB09F                 lea     eax, [ebp+var_18]
  15. .text:00ECB0A2                 push    eax
  16. .text:00ECB0A3                 lea     eax, [ebp+var_A]
  17. .text:00ECB0A6                 push    eax
  18. .text:00ECB0A7                 lea     ecx, [ebp+var_9]
  19. .text:00ECB0AA                 lea     edx, [ebp+var_8]
  20. .text:00ECB0AD                 lea     eax, [ebp+var_4]
  21. .text:00ECB0B0                 call    sub_EC52D8
  22. .text:00ECB0B5                 xor     edx, edx
  23. .text:00ECB0B7                 mov     eax, [ebx+3E8h]
  24. .text:00ECB0BD                 call    sub_544D58
  25. .text:00ECB0C2                 cmp     [ebp+var_A], 0
  26. .text:00ECB0C6                 jz      short loc_ECB0EA
  27. .text:00ECB0C8                 mov     edx, offset aYourLicenseKey
  28. ; "Your license key is no longer available"...
  29. .text:00ECB0CD                 mov     eax, [ebx+430h]
  30. .text:00ECB0D3                 call    sub_544EA8
  31. .text:00ECB0D8                 xor     edx, edx
  32. .text:00ECB0DA                 mov     eax, [ebx+434h]
  33. .text:00ECB0E0                 call    sub_544EA8
  34. .text:00ECB0E5                 jmp     loc_ECB22D
  35. .text:00ECB0EA ; ----------------------------------------
  36. .text:00ECB0EA loc_ECB0EA:
  37. .text:00ECB0EA                 lea     eax, [ebp+var_20]
  38. .text:00ECB0ED                 push    eax
  39. .text:00ECB0EE                 mov     ecx, offset aThisProductIsL
  40. ; "This product is licensed to : "
  41. .text:00ECB0F3                 mov     edx, offset aLbllicenseto
  42. ; "lblLicenseTo"
  43. .text:00ECB0F8                 mov     eax, offset aAbout ; "About"
  44. .text:00ECB0FD                 call    sub_104A4D8
  45. .text:00ECB102                 mov     edx, [ebp+var_20]
  46. .text:00ECB105                 mov     eax, [ebx+430h]
  47. .text:00ECB10B                 call    sub_544EA8
  48. .text:00ECB110                 mov     edx, [ebp+var_4]
  49. .text:00ECB113                 mov     eax, [ebx+434h]
  50. .text:00ECB119                 call    sub_544EA8
  51. .text:00ECB11E                 jmp     loc_ECB22D
  52. .text:00ECB123 ; ----------------------------------------
  53. .text:00ECB123 loc_ECB123:
  54. ; Контрольное значение ESI = 2711h ?
  55. .text:00ECB123                 cmp     esi, 2711h
  56. .text:00ECB129                 jnz     loc_ECB202
  57. .text:00ECB12F                 lea     eax, [ebp+var_18]
  58. .text:00ECB132                 push    eax
  59. .text:00ECB133                 lea     eax, [ebp+var_A]
  60. .text:00ECB136                 push    eax
  61. .text:00ECB137                 lea     ecx, [ebp+var_9]
  62. .text:00ECB13A                 lea     edx, [ebp+var_8]
  63. .text:00ECB13D                 lea     eax, [ebp+var_4]
  64. .text:00ECB140                 call    sub_EC52D8
  65. .text:00ECB145                 mov     dl, 1
  66. .text:00ECB147                 mov     eax, [ebx+3E8h]
  67. .text:00ECB14D                 call    sub_544D58
  68. .text:00ECB152                 lea     eax, [ebp+var_24]
  69. .text:00ECB155                 push    eax
  70. .text:00ECB156                 mov     ecx, offset aUnregisteredTr
  71. ; "UNREGISTERED : TRIAL"
  72. .text:00ECB15B                 mov     edx, offset aLbltrial ; "lblTrial"
  73. .text:00ECB160                 mov     eax, offset aAbout ; "About"
  74. .text:00ECB165                 call    sub_104A4D8
  75. .text:00ECB16A                 mov     edx, [ebp+var_24]
  76. .text:00ECB16D                 mov     eax, [ebx+430h]
  77. .text:00ECB173                 call    sub_544EA8
  78. .text:00ECB178                 lea     eax, [ebp+var_28]
  79. .text:00ECB17B                 push    eax
  80. .text:00ECB17C                 mov     ecx, offset aExpires ; "Expires :"
  81. .text:00ECB181                 mov     edx, offset aLbltrialexpire
  82. ; "lblTrialExpiredDate"
  83. .text:00ECB186                 mov     eax, offset aAbout ; "About"
  84. .text:00ECB18B                 call    sub_104A4D8
  85. .text:00ECB190                 lea     eax, [ebp+var_28]
Что тут происходит? Вызывается какая-то функция проверки, если она вернула EAX=2710h, то программа считается зарегистрированной, иначе выводится сообщение об оставшемся триальном периоде. Кроме того, у зарегистрированной программы есть два состояния, это когда ключ по какой-то причине уже недоступен, и когда есть регистрационное имя и все остальное сопутствующее. Но в любом из этих "зарегистрированных" режимов программа работает без ограничений. Открываем на редактирование функцию проверки по адресу 00EC4FF8 и вбиваем в ее начало пару команд MOV EAX,2710h и RET. Теперь при любом раскладе программа будет считать себя зарегистрированной. Сохраняем изменения, запускаем. Окно с триальным счетчиком при старте больше не появляется. В окне "О программе" вместо данных триала отображается сообщение, что наш ключ недоступен.

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

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

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

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

Комментарии

Отзывы посетителей сайта о статье
Vladimir (05.02.2021 в 23:17):
brute, спасибо, ознакомлюсь. Вообще идеальная программа для того, чтобы быстро кому-то что-то показать в картинках, ничего лишнего.
LaScala (05.02.2021 в 22:57):
brute, спасибо большое!
вариант с переименованием en.txt --> ru.txt вполне приемлем.
И, да, Вы правы: на английском совсем не сложно.
brute (05.02.2021 в 21:31):
LaScala, Можно взять файл ru.txt из последней версии на сайте, исправлять этот (переименовав в en.txt), перевести в редакторе ресурсов, использовать спец. прогу для локализации программ.. или пользоваться английской.
LaScala (05.02.2021 в 21:01):
Brute, спасибо! Непонятно, как включить русскую локаль.
Файл locales\ru.txt присутствует. В окне Options -- Language в выпадающем списке только - English. Возможно, я несколько туп... ))
brute (05.02.2021 в 17:16):
Vladimir, вот "моя" (патченная):
https://yadi.sk/d/6NJbv0rUvFFX6A
эта версия и последняя заливают на разные хостинги, у "моей" ссылка "прямая", подходит для размещения на сайтах. Сам подсмотрел как патчить, не помню где..
Vladimir (05.02.2021 в 12:10):
brute, спасибо, тогда я вполне мог и не знать, потому что не пользуюсь этой возможностью, сразу шлю в скайпе/слаке.
brute (05.02.2021 в 09:59):
Vladimir, не помню уже) Кажется, там какие-то ограничения с заливкой скрина в облако.. Может, в последних версиях и убрали все ограничения. У меня v5.4.0.1
Vladimir (04.02.2021 в 23:18):
brute, стало интересно, а от чего нужно лечить lightshot? Пользуюсь несколько лет, просто работает, ничем о себе не напоминая.
brute (28.01.2021 в 20:12):
14Мб дистрибутив? Есть же Lightshot, который "лечится" за минуту, ничем не накрыт и весит 1,5Мб после установки. И без "любимого" плиточного  дизайна. На сервере скрины хранятся недолго (м/быть пару месяцев), но это у всех подобных программ так.
Fury (26.01.2021 в 14:16):
Thank you...
https://ibb.co/KXhhG15
Павел (26.01.2021 в 12:04):
Exit, бесплатная версия время от времени выдаёт сообщение с предложением то ли купить про, то ли ещё что (не помню).
Exit (26.01.2021 в 10:16):
ManHunter, нет, не блочил.
Да и на Ru-Board нет жалоб, что реклама лезет.
Давно ей пользуюсь, нравится, что можно сразу залить картинку.
Сейчас погонял несколько разных версий - рекламы нет)
Разраб, наверное, пугает, чтоб народ ломился в кассу ))

P.S. ссыль на старые версии _https://www.filepuma.com/download/picpick-206/versions/
Если будет нужна портабельная, то сетап распаковывается 7-Zip'ом,
только надо удалить saveappdata.ini

Забыл добавить.
В бесплатной версии, можно удалить из папки VMProtectSDK32.dll
Прога запускается и без этой dll )))
ManHunter (26.01.2021 в 09:12):
Может на фаерволе заблочена, вот и не качает всякую гадость.
Exit (26.01.2021 в 08:47):
Обновился, на последнюю бесплатную, тоже рекламы нет.
Это только я такой "особенный" или просто "не вижу" ее?)
Exit (26.01.2021 в 08:16):
Еще при чтении заголовка, челюсть упала на клаву, т.к знаю, что в папке лежит VMProtectSDK32.dll
А оказалось, что автор проги не использовал все возможности протектора))
Странный гражданин... Это так, мысли в слух.
Спасибо за интересный разбор!
P.S. пользуюсь v_4.2.8 - рекламы нет.
ManHunter (25.01.2021 в 21:58):
Конечно. Этим занимаются совершенно другие люди и совсем не ради спортивного интереса, а за вполне ощутимый прайс. Да и методы, которые они используют, никто по полочкам с красивыми картиночками выкладывать тоже не будет.
Жека (25.01.2021 в 21:09):
А что насчёт VMProtect? Фейк? Лично я думаю, автор бы не осилил его анпакнуть не при каком раскладе:)
doz.me (25.01.2021 в 20:20):
начало располагало на эпичную греблю с VMProtect)

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

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

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