Blog. Just Blog

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

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

Wise Video Converter - видеоконвертер с поддержкой множества форматов, который позволяет обработать видео для воспроизведения на компьютере и на мобильных устройствах. Хотя по сути это всего лишь очередная цветастая обертка, паразитирующая на бесплатной библиотеке FFmpeg. Из великой программерской мысли тут только нарисованный интерфейс. Ну что ж, будем восстанавливать справедливость.

Берем с сайта дистрибутив, устанавливаем, смотрим что и как. Основной исполняемый файл не упакован и не защищен, отправляем его на разбор в дизассемблер. Пока тот работает, выясним проявления триальности и реакцию на левые регистрационные данные.

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

Программа многоязычная, строки локализации хранятся в ini-файлах, строке сообщения соответствует индекс InvalidKey. Поищем ее в дизассемблере и выясним условия, при которых она появляется:
  1. .text:0056691D                 jz      short loc_566924
  2. .text:0056691F                 sub     eax, 4
  3. .text:00566922                 mov     eax, [eax]
  4. .text:00566924 loc_566924:
  5. ; Проверить длину серийника, она должна быть 26 (1Ah) символов
  6. .text:00566924                 cmp     eax, 1Ah
  7. .text:00566927                 jz      short loc_56697C
  8. .text:00566929                 push    1
  9. .text:0056692B                 movzx   eax, ds:word_566B24
  10. .text:00566932                 push    eax
  11. .text:00566933                 lea     eax, [ebp+var_4C]
  12. .text:00566936                 push    eax
  13. .text:00566937                 mov     ecx, offset aError_3 ; "Error"
  14. .text:0056693C                 mov     edx, offset aError_3 ; "Error"
  15. .text:00566941                 mov     eax, offset aTranslation_2
  16. ; "Translation"
  17. .text:00566946                 call    sub_5427EC
  18. .text:0056694B                 mov     eax, [ebp+var_4C]
  19. .text:0056694E                 push    eax
  20. .text:0056694F                 lea     eax, [ebp+var_50]
  21. .text:00566952                 push    eax
  22. .text:00566953                 mov     ecx, offset aInvalidLicense
  23.  ; "Invalid license key."
  24. .text:00566958                 mov     edx, offset aInvalidkey
  25. ; "InvalidKey"
Первым делом проверяется длина серийника. Как видно из кода, она должна быть ровно 26 символов, ни больше, ни меньше. Следующая часть кода проверок:
  1. .text:0056698A                 lea     eax, [ebx+3BCh]
  2. .text:00566990                 call    sub_406064
  3. .text:00566995                 lea     ecx, [ebp+var_8]
  4. .text:00566998                 mov     edx, offset aWisevideoconve
  5. ; "WiseVideoConverter2.x"
  6. .text:0056699D                 mov     eax, [ebx+3BCh]
  7. .text:005669A3                 call    sub_54226C
  8. .text:005669A8                 mov     eax, [ebp+var_8]
  9. ; Вызвать функцию проверки
  10. .text:005669AB                 call    sub_541C68
  11. ; Если AL=0, то введенные регистрационные данные неправильные
  12. .text:005669B0                 test    al, al
  13. .text:005669B2                 jz      loc_566A85
  14. .text:005669B8                 mov     byte ptr [ebx+3B4h], 1
  15. .text:005669BF                 lea     eax, [ebp+var_C]
  16. .text:005669C2                 push    eax
  17. .text:005669C3                 lea     edx, [ebp+var_80]
  18. .text:005669C6                 mov     eax, [ebx+3A0h]
  19. .text:005669CC                 mov     eax, [eax+2BCh]
  20. .text:005669D2                 call    sub_40CF80
  21. .text:005669D7                 mov     eax, [ebp+var_80]
  22. .text:005669DA                 mov     [ebp+var_7C], eax
  23. .text:005669DD                 mov     [ebp+var_78], 11h
  24. .text:005669E1                 lea     edx, [ebp+var_84]
  25. .text:005669E7                 mov     eax, [ebx+3A4h]
  26. .text:005669ED                 mov     eax, [eax+2BCh]
  27. .text:005669F3                 call    sub_40CF80
  28. .text:005669F8                 mov     eax, [ebp+var_84]
  29. .text:005669FE                 mov     [ebp+var_74], eax
  30. .text:00566A01                 mov     [ebp+var_70], 11h
  31. .text:00566A05                 lea     edx, [ebp+var_88]
  32. .text:00566A0B                 xor     eax, eax
  33. .text:00566A0D                 call    sub_40CF80
  34. .text:00566A12                 mov     eax, [ebp+var_88]
  35. .text:00566A18                 mov     [ebp+var_6C], eax
  36. .text:00566A1B                 mov     [ebp+var_68], 11h
  37. .text:00566A1F                 mov     [ebp+var_64], 0Bh
  38. .text:00566A26                 mov     [ebp+var_60], 0
  39. .text:00566A2A                 lea     edx, [ebp+var_8C]
  40. .text:00566A30                 mov     eax, [ebp+var_4]
  41. .text:00566A33                 call    sub_40CF80
  42. .text:00566A38                 mov     eax, [ebp+var_8C]
  43. .text:00566A3E                 mov     [ebp+var_5C], eax
  44. .text:00566A41                 mov     [ebp+var_58], 11h
  45. .text:00566A45                 lea     edx, [ebp+var_7C]
  46. ; Проверить регистрацию на сервере
  47. .text:00566A48                 mov     ecx, 4
  48. .text:00566A4D                 mov     eax, offset aHttpReg_wisecl
  49. ; "http://reg.wisecleaner.com/order/regche"...
  50. .text:00566A52                 call    unknown_libname_128
  51. .text:00566A57                 mov     ecx, [ebp+var_C]
  52. .text:00566A5A                 mov     dl, 1
  53. .text:00566A5C                 mov     eax, ds:off_4CCEF4 ; lpThreadId
  54. .text:00566A61                 call    @Webauto@TIteratorSupport
  55. .text:00566A66                 mov     byte ptr [eax+0Fh], 1
  56. .text:00566A6A                 mov     [eax+7Ch], ebx
  57. .text:00566A6D                 mov     dword ptr [eax+78h], offset sub_565AC8
  58. .text:00566A74                 mov     [eax+6Ch], ebx
  59. .text:00566A77                 mov     dword ptr [eax+68h], offset sub_565C30
  60. .text:00566A7E                 call    @Classes@TThread@Resume$qqrv
  61. .text:00566A83                 jmp     short loc_566ADF
  62. .text:00566A85 ; --------------------------------------------
  63. .text:00566A85 loc_566A85:
  64. .text:00566A85                 push    1
  65. .text:00566A87                 movzx   eax, ds:word_566B24
  66. .text:00566A8E                 push    eax
  67. .text:00566A8F                 lea     eax, [ebp+var_90]
  68. .text:00566A95                 push    eax
  69. .text:00566A96                 mov     ecx, offset aError_3 ; "Error"
  70. .text:00566A9B                 mov     edx, offset aError_3 ; "Error"
  71. .text:00566AA0                 mov     eax, offset aTranslation_2
  72. ; "Translation"
  73. .text:00566AA5                 call    sub_5427EC
  74. .text:00566AAA                 mov     eax, [ebp+var_90]
  75. .text:00566AB0                 push    eax
  76. .text:00566AB1                 lea     eax, [ebp+var_94]
  77. .text:00566AB7                 push    eax
  78. .text:00566AB8                 mov     ecx, offset aInvalidLicense
  79. ; "Invalid license key."
  80. .text:00566ABD                 mov     edx, offset aInvalidkey
  81. ; "InvalidKey"
  82. .text:00566AC2                 mov     eax, offset aMessage_2
  83. ; "Message"
  84. .text:00566AC7                 call    sub_5427EC
  85. .text:00566ACC                 mov     edx, [ebp+var_94]
  86. .text:00566AD2                 mov     eax, off_5C3F98
Все выглядит достаточно просто. Вызывается функция проверки, по ее результатам или выводится сообщение о неправильной регистрации, или программа лезет на свой сервер и проверяет или фиксирует факт регистрации. Понятное дело, что в сеть программу выпускать не надо. Открываем исполняемый файл на редактирование, впечатываем в начало функции проверки по адресу 00541C68 пару команд MOV EAX,1 и RET, сохраняем изменения.

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

В интерфейсе надпись "FREE" сменилась на "PRO", пропала кнопка покупки и пункт регистрации в меню. Ограничений по продолжительности обрабатываемого файла в 30 минут тоже нет. Цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (01.08.2023 в 15:01):
Там длина серийника должна быть 26 символов. Или запатчить условный переход. Добавил в статью, спасибо.
Сергей (01.08.2023 в 15:00):
Разобрался вроде. Индекс InvalidKey встречается 2 раза, пройти первый надо просто условный переход по адрессу 00566927 меняем на безусловный, затем нас пускает к проверке ключа и далее как в статье.
Сергей (01.08.2023 в 14:50):
Что то не так, поставил брекпоинт по адрессу 00541C68, запустил программу данные адресс не задейстован, попробовал ввести любые данные license error и данный адресс также не задействует

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

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

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