Blog. Just Blog

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

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

Программа Nevercenter CameraBag 2 предназначена для очень быстрого редактирования ваших фотографий. К фотографиям можно применить на выбор более 150 готовых эффектов или сконструировать свой, если этого будет мало. В итоге даже самая неудачная фотка может превратиться в шЫдевр из серии "я художник, я так вижу". Шутка. Нечто подобное, наверное, делается во всяких популярных сервисах типа Инстаграмма. C Nevercenter CameraBag 2 можно бесплатно поиграться в течение 15 дней, после чего надо будет раскошелиться на ее покупку. А можно и не доходить до таких крайностей.

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

Окно регистрации
Окно регистрации

На ввод неправильного серийного номера программа реагирует сообщением "Invalid registration code. Try copying and pasting the code from your registration email". Это и есть основная зацепка для исследований. Если регистрироваться пока нет желания или возможности, то можно опробовать триальный режим. Тут тоже есть небольшая зацепка - ссылка на покупку в виде надписи "BUY this app" в главном окне.

Триальная надпись в окне программы
Триальная надпись в окне программы

Дизассемблер к этому времени должен закончить работу. Начнем с поиска первой строки о неправильном регистрационном коде.
  1. .text:00482866                 call    sub_4816C0
  2. .text:0048286B                 test    al, al
  3. .text:0048286D                 jz      short loc_48287B
  4. .text:0048286F                 mov     eax, [ebx]
  5. .text:00482871                 mov     ecx, ebx
  6. .text:00482873                 call    dword ptr [eax+0C0h]
  7. .text:00482879                 jmp     short loc_4828AC
  8. .text:0048287B ; -----------------------------------------------
  9. .text:0048287B loc_48287B:
  10. .text:0048287B                 push    offset aInvalidRegistr
  11. ; "Invalid registration code. Try copying "...
  12. .text:00482880                 lea     ecx, [ebp+var_4]
  13. .text:00482883                 call    ds:??0QString@@QAE@PBD@Z
Ничего необычного. Выполняется какая-то функция проверки, если она вернула AL=0, то серийный номер считается неправильным. Смотрим функцию проверки.
  1. .text:004816C0 sub_4816C0      proc near
  2. .text:004816C0 var_18          = dword ptr -18h
  3. .text:004816C0 var_14          = dword ptr -14h
  4. .text:004816C0 var_10          = dword ptr -10h
  5. .text:004816C0 var_C           = dword ptr -0Ch
  6. .text:004816C0 var_8           = dword ptr -8
  7. .text:004816C0 var_4           = dword ptr -4
  8. .text:004816C0 arg_0           = dword ptr  8
  9. .text:004816C0 arg_4           = dword ptr  0Ch
  10. .text:004816C0
  11. .text:004816C0                 push    ebp
  12. .text:004816C1                 mov     ebp, esp
  13. .text:004816C3                 and     esp, 0FFFFFFF8h
  14. .text:004816C6                 sub     esp, 1Ch
  15. .text:004816C9                 push    ebx
  16. .text:004816CA                 push    esi
  17. .text:004816CB                 mov     esi, ecx
  18. .text:004816CD                 push    edi
  19. .text:004816CE                 mov     edi, [ebp+arg_0]
  20. .text:004816D1                 push    dword ptr [esi+34h]
  21. .text:004816D4                 lea     eax, [esi+24h]
  22. .text:004816D7                 push    dword ptr [esi+30h]
  23. .text:004816DA                 push    eax
  24. .text:004816DB                 push    edi
  25. ; Вызвать функцию проверки
  26. .text:004816DC                 call    sub_4819F0
  27. ; Сохранить ее результат из AL и BL
  28. .text:004816E1                 mov     bl, al
  29. .text:004816E3                 movzx   ecx, bl
  30. .text:004816E6                 push    ecx
  31. .text:004816E7                 push    offset aCodeIsValidI ; "code is valid %i"
  32. .text:004816EC                 call    sub_48C4E4
  33. .text:004816F1                 add     esp, 8
  34. ; Проверить сохраненный результат
  35. .text:004816F4                 test    bl, bl
  36. ; Если BL=0 (функция проверки вернула AL=0), то серийный номер неправильный
  37. .text:004816F6                 jz      loc_4817AB
  38. .text:004816FC                 push    [ebp+arg_4]
  39. .text:004816FF                 mov     edx, edi
  40. .text:00481701                 mov     ecx, esi
  41. .text:00481703                 call    loc_4811C0
  42. .text:00481708                 add     esp, 4
  43. .text:0048170B                 test    al, al
  44. .text:0048170D                 jz      loc_4817AB
  45. .text:00481713                 lea     ecx, [esp+28h+var_18]
  46. .text:00481717                 mov     [esp+28h+var_18], 0
  47. .text:0048171F                 mov     [esp+28h+var_10], 0
  48. .text:00481727                 mov     [esp+28h+var_14], 0
  49. .text:0048172F                 call    sub_46DE70
  50. .text:00481734                 lea     ecx, [esp+28h+var_C]
  51. .text:00481738                 mov     [esp+28h+var_C], 0
  52. .text:00481740                 mov     [esp+28h+var_4], 0
  53. .text:00481748                 mov     [esp+28h+var_8], 0
  54. .text:00481750                 call    sub_46DE70
  55. .text:00481755                 lea     eax, [esp+28h+var_C]
  56. .text:00481759                 mov     ecx, esi
  57. .text:0048175B                 push    eax
  58. .text:0048175C                 lea     edx, [esp+2Ch+var_18]
  59. .text:00481760                 call    sub_480F70
  60. .text:00481765                 add     esp, 4
  61. .text:00481768                 lea     eax, [esi+24h]
  62. .text:0048176B                 push    dword ptr [esi+34h]
  63. .text:0048176E                 push    dword ptr [esi+30h]
  64. .text:00481771                 push    eax
  65. .text:00481772                 lea     eax, [esp+34h+var_18]
  66. .text:00481776                 push    eax
  67. .text:00481777                 call    sub_4819F0
  68. .text:0048177C                 mov     ecx, [esp+28h+var_C]
  69. .text:00481780                 mov     bl, al
  70. .text:00481782                 test    ecx, ecx
  71. .text:00481784                 jz      short loc_48178F
  72. .text:00481786                 push    ecx
  73. .text:00481787                 call    sub_477840
  74. .text:0048178C                 add     esp, 4
  75. .text:0048178F loc_48178F:
  76. .text:0048178F                 mov     eax, [esp+28h+var_18]
  77. .text:00481793                 test    eax, eax
  78. .text:00481795                 jz      short loc_4817A0
  79. .text:00481797                 push    eax
  80. .text:00481798                 call    sub_477840
  81. .text:0048179D                 add     esp, 4
  82. .text:004817A0 loc_4817A0:
  83. .text:004817A0                 mov     al, bl
  84. .text:004817A2                 pop     edi
  85. .text:004817A3                 pop     esi
  86. .text:004817A4                 pop     ebx
  87. .text:004817A5                 mov     esp, ebp
  88. .text:004817A7                 pop     ebp
  89. .text:004817A8                 retn    8
  90. .text:004817AB ; -------------------------------
  91. .text:004817AB loc_4817AB:
  92. .text:004817AB                 pop     edi
  93. .text:004817AC                 pop     esi
  94. ; Серийный номер неправильный
  95. .text:004817AD                 xor     al, al
  96. .text:004817AF                 pop     ebx
  97. .text:004817B0                 mov     esp, ebp
  98. .text:004817B2                 pop     ebp
  99. .text:004817B3                 retn    8
  100. .text:004817B3 sub_4816C0      endp
Вроде бы все понятно, но смущает один момент: функция проверки вызывается только один раз и только после ввода регистрационных данных. Логично было бы предположить, что аналогичная проверка серийника должна выполняться как минимум еще один раз при старте программы. Значит надо копать еще глубже, а именно функцию проверки по адресу 004819F0, после которой в случае неудачи серийник сразу же считается невалидным. Функция проверки вызывается из трех мест, что уже ближе к истине. Она достаточно объемная, но в лучших традициях программирования имеет один вход и один выход. На выходе все сводится к следующему коду:
  1. ...
  2. .text:00481C8F                 pop     edi
  3. .text:00481C90                 pop     esi
  4. .text:00481C91                 mov     al, bl
  5. .text:00481C93                 pop     ebx
  6. .text:00481C94                 mov     esp, ebp
  7. .text:00481C96                 pop     ebp
  8. .text:00481C97                 retn    10h
Как видите, результат проверки в регистр AL записывается по адресу 00481C91, поэтому достаточно поменять эту команду на MOV AL,1 и любой серийный номер всегда будет считаться правильным. Сохраняем изменения, запускаем.

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

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

REGEDIT4

[HKEY_CURRENT_USER\Software\Nevercenter\CameraBag2]
"RegInfoName"="ManHunter / PCL"
"RegInfoCode"="FUCK SHAREWARE!"

А если сразу после патча добавить в реестр такой REG-файл, то даже не придется ничего вводить при запуске. Цель достигнута, можно продолжать заниматься творчеством.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (20.07.2014 в 11:31):
Да, так будет правильнее.
ufo (20.07.2014 в 01:30):
ЦитатаЦель достигнута, пора приступать к художественному творчеству.

Я бы сказал продолжать творчество. Как всегда в лучших традициях.
FUCK SHAREWARE! LOL

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

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

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