Blog. Just Blog

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

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

AceMovi Video Editor - полупрофессиональное решение для домашнего видеомонтажа. По функционалу более простой, чем признанные видеоредакторы, но при этом инструментов в нем вполне достаточно, чтобы без особых сложностей превратить ваши видеоролики в настоящие шедевры. В незарегистрированном виде редактор накладывает на сохраняемые файлы водяной знак. Цена кусается. Для 60 баксов я бы точно нашел более подходящее применение.

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

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

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

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

Строка легко обнаруживается в исполняемом файле. Дизассемблер уже закончил работу, поищем код, где эта строка используется.
  1. .text:0056D2E0 sub_56D2E0      proc near
  2. .text:0056D2E0                 push    0FFFFFFFFh
  3. .text:0056D2E2                 push    offset loc_73A223
  4. .text:0056D2E7                 mov     eax, large fs:0
  5. .text:0056D2ED                 push    eax
  6. .text:0056D2EE                 sub     esp, 14h
  7. .text:0056D2F1                 push    ebx
  8. .text:0056D2F2                 push    ebp
  9. .text:0056D2F3                 push    esi
  10. .text:0056D2F4                 push    edi
  11. .text:0056D2F5                 mov     eax, dword_878750
  12. .text:0056D2FA                 xor     eax, esp
  13. .text:0056D2FC                 push    eax
  14. .text:0056D2FD                 lea     eax, [esp+34h+var_C]
  15. .text:0056D301                 mov     large fs:0, eax
  16. .text:0056D307                 mov     esi, ecx
  17. .text:0056D309                 lea     eax, [esp+34h+var_20]
  18. .text:0056D30D                 push    1
  19. .text:0056D30F                 push    eax
  20. .text:0056D310                 call    sub_5C5710
  21. .text:0056D315                 add     esp, 4
  22. .text:0056D318                 push    offset aImageBtn_close
  23. ; "/image/btn_close.png"
  24. .text:0056D31D                 mov     ecx, eax
  25. .text:0056D31F                 mov     [esp+3Ch+var_4], 0
  26. .text:0056D327                 call    ds:?append@QString@@QAEAAV1@PBD@Z
  27. ; QString::append(char const *)
  28. .text:0056D32D                 push    ecx
  29. .text:0056D32E                 mov     ecx, esp
  30. .text:0056D330                 mov     [esp+40h+var_20], esp
  31. .text:0056D334                 push    eax
  32. .text:0056D335                 call    ds:??0QString@@QAE@ABV0@@Z
  33. ; QString::QString(QString const &)
  34. .text:0056D33B                 mov     ecx, esi
  35. .text:0056D33D                 call    sub_56BCB0
  36. .text:0056D342                 or      ebp, 0FFFFFFFFh
  37. .text:0056D345                 lea     ecx, [esp+3Ch+var_28]
  38. .text:0056D349                 mov     [esp+3Ch+var_C], ebp
  39. .text:0056D34D                 call    ds:??1QString@@QAE@XZ
  40. ; QString::~QString(void)
  41. .text:0056D353                 mov     ecx, [esi+20h]
  42. .text:0056D356                 push    8
  43. .text:0056D358                 push    1C7h
  44. .text:0056D35D                 call    ds:?move@QWidget@@QAEXHH@Z
  45. ; QWidget::move(int,int)
  46. .text:0056D363                 mov     ecx, [esi+20h]
  47. .text:0056D366                 mov     ebx, ds:?connect
  48. .text:0056D36C                 push    0
  49. .text:0056D36E                 push    offset a1close  ; "1close()"
  50. .text:0056D373                 push    esi
  51. .text:0056D374                 push    offset a2clicked ; "2clicked()"
  52. .text:0056D379                 push    ecx
  53. .text:0056D37A                 lea     edx, [esp+58h+var_30]
  54. .text:0056D37E                 push    edx
  55. .text:0056D37F                 call    ebx
  56. .text:0056D381                 add     esp, 18h
  57. .text:0056D384                 lea     ecx, [esp+44h+var_30]
  58. .text:0056D388                 call    ds:??1Connection@QMetaObject@@QAE@XZ
  59. ; QMetaObject::Connection::~Connection(void)
  60. .text:0056D38E                 mov     ecx, [esi+3Ch]
  61. .text:0056D391                 push    29h
  62. .text:0056D393                 push    14h
  63. .text:0056D395                 call    ds:?move@QWidget@@QAEXHH@Z
  64. ; QWidget::move(int,int)
  65. .text:0056D39B                 push    ebp
  66. .text:0056D39C                 push    0
  67. .text:0056D39E                 lea     eax, [esp+4Ch+var_30]
  68. .text:0056D3A2                 push    offset aTheTrialVersio
  69. ; "The trial version exports video with a "...
  70. .text:0056D3A7                 push    eax
  71. .text:0056D3A8                 call    ds:?tr@QObject@@SA?AVQString@@PBD0H@Z
  72. ; QObject::tr(char const *,char const *,int)
  73. .text:0056D3AE                 add     esp, 10h
Строка выводится внутри процедуры, в которой нет никаких условных переходов. То есть она отвечает, например, за открытие этого окна. По единственной перекрестной ссылке выходим на следующую процедуру, откуда вызывается эта. Там тоже никаких условий нет, это может быть надстройка над открытием окна. Qt же, тут такие фокусы в порядке вещей. По единственной ссылке переходим на код, откуда вызывается вторая процедура.
  1. .text:0057CB9E                 lea     eax, [esp+1A4h+var_C]
  2. .text:0057CBA5                 mov     large fs:0, eax
  3. .text:0057CBAB                 mov     esi, ecx
  4. ; Вызвать функцию проверки
  5. .text:0057CBAD                 call    sub_40A440
  6. .text:0057CBB2                 test    al, al
  7. ; Если AL не равно 0, то окно с предупреждением не показывать
  8. .text:0057CBB4                 jnz     short loc_57CC04
  9. .text:0057CBB6                 push    esi
  10. .text:0057CBB7                 lea     ecx, [esp+1A8h+var_148]
  11. ; Открыть окно с предупреждением
  12. .text:0057CBBB                 call    sub_56D6E0
  13. .text:0057CBC0                 lea     ecx, [esp+1A4h+var_148]
  14. .text:0057CBC4                 mov     [esp+1A4h+var_4], 0
  15. .text:0057CBCF                 call    ds:__imp_?exec@QDialog@@UAEHXZ
  16. .text:0057CBD5                 lea     ecx, [esp+1A4h+var_148]
  17. .text:0057CBD9                 cmp     eax, 1
  18. .text:0057CBDC                 jz      short loc_57CBF3
  19. .text:0057CBDE                 mov     [esp+1A4h+var_4], 0FFFFFFFFh
  20. .text:0057CBE9                 call    sub_56CBB0
  21. .text:0057CBEE                 jmp     loc_57D33C
  22. .text:0057CBF3 ; ---------------------------------------------------------
  23. .text:0057CBF3 loc_57CBF3:
  24. .text:0057CBF3                 or      ebp, 0FFFFFFFFh
Посмотрим на функцию проверки.
  1. .text:0040A440 sub_40A440      proc near
  2. .text:0040A440                 jmp     sub_4031C0
  3. .text:0040A440 sub_40A440      endp
Это даже не функция, а переходник, причем целевая sub_4031C0 больше ниоткуда не вызывается. Чудны дела твои, Qt. Как мы помним, для корректного результата должно вернуться ненулевое значение AL. Отлично, заменяем переход на пару команд MOV AL,1 и RET, сохраняем изменения.

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

Окно регистрации поменяло свой вид, теперь там типа показывается регистрационный email и серийник, а всяких ссылок на покупку больше нет. При попытке сохранить обработанное видео никаких предупреждений не появляется и никаких водяных знаков не накладывается. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (11.03.2022 в 08:54):
Она самая. Епифанцев жжот :)
Игорь (11.03.2022 в 07:41):
Операция "Тайд":)

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

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

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