Blog. Just Blog

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

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

BeeConverter - мультимедийный комбайн для конвертации медиафайлов между наиболее популярными форматами. Дополнительно есть функции обрезки видео, сборки видеоролика из фрагментов, конвертирования видео в анимированный GIF. Полезная штука, хотя ничего принципиально нового в программе нет. С другой стороны являет собой кучу новомодных технологий, таких как регистрация по подписке, постоянные онлайновые проверки, слив данных разработчику и всякое такое. Несанкционированная сетевая активность лечится фаерволом, а вот с регистрацией придется помочь.

Забираем дистрибутив, устанавливаем, смотрим что и как. Программа написана на Qt, ничем не упакована. При старте вываливает триальное окно:

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

По строчке "Trial" в листинге обнаруживается несколько вхождений, но нас пока интересует только следующий код:
  1. ; Проверить значение переменной
  2. .text:0043FA5E                 cmp     [ebp+var_D], 0
  3. .text:0043FA62                 mov     ecx, [ebx+48h]
  4. .text:0043FA65                 mov     [ebp+var_4], 0FFFFFFFFh
  5. .text:0043FA6C                 mov     eax, [ecx]
  6. ; Если она равна 0, то вывести в заголовок строку "Trial"
  7. .text:0043FA6E                 jz      short loc_43FAAD
  8. .text:0043FA70                 push    0
  9. .text:0043FA72                 call    dword ptr [eax+2Ch]
  10. .text:0043FA75                 mov     ecx, [ebx+4Ch]
  11. .text:0043FA78                 push    0
  12. .text:0043FA7A                 mov     eax, [ecx]
  13. .text:0043FA7C                 call    dword ptr [eax+2Ch]
  14. .text:0043FA7F                 mov     ecx, [ebx+50h]
  15. .text:0043FA82                 push    1
  16. .text:0043FA84                 mov     eax, [ecx]
  17. .text:0043FA86                 call    dword ptr [eax+2Ch]
  18. .text:0043FA89                 push    0FFFFFFFFh
  19. ; Вывести в заголовок строку "Pro"
  20. .text:0043FA8B                 push    0
  21. .text:0043FA8D                 push    offset aPro_0   ; "Pro"
  22. .text:0043FA92                 lea     eax, [ebp+Memory]
  23. .text:0043FA95                 mov     ecx, offset off_5C89AC
  24. .text:0043FA9A                 push    eax
  25. .text:0043FA9B                 call    ds:?tr@QMetaObject@@QBE?AVQString
  26. .text:0043FAA1                 mov     [ebp+var_4], 5
  27. .text:0043FAA8                 jmp     loc_43F9F1
  28. .text:0043FAAD ; --------------------------------------------
  29. .text:0043FAAD loc_43FAAD:
  30. .text:0043FAAD                 push    1
  31. .text:0043FAAF                 call    dword ptr [eax+2Ch]
  32. .text:0043FAB2                 mov     ecx, [ebx+4Ch]
  33. .text:0043FAB5                 push    1
  34. .text:0043FAB7                 mov     eax, [ecx]
  35. .text:0043FAB9                 call    dword ptr [eax+2Ch]
  36. .text:0043FABC                 mov     ecx, [ebx+50h]
  37. .text:0043FABF                 push    0
  38. .text:0043FAC1                 mov     eax, [ecx]
  39. .text:0043FAC3                 call    dword ptr [eax+2Ch]
  40. .text:0043FAC6                 push    0FFFFFFFFh
  41. .text:0043FAC8                 push    0
  42. .text:0043FACA                 push    offset aTrial   ; "Trial"
  43. .text:0043FACF                 lea     eax, [ebp+var_1C]
  44. .text:0043FAD2                 mov     ecx, offset off_5C89AC
  45. .text:0043FAD7                 push    eax
Чуть выше находится код, где значение этой переменной инициализируется:
  1. .text:0043FA12                 mov     ecx, [eax]
  2. .text:0043FA14                 mov     [ebp+var_4], 3
  3. ; Вызвать функцию проверки
  4. .text:0043FA1B                 call    sub_43B810
  5. .text:0043FA20                 mov     esi, [ebp+Memory]
  6. ; Сохранить ее возвращенное значение в переменную
  7. .text:0043FA23                 mov     [ebp+var_D], al
  8. .text:0043FA26                 mov     [ebp+var_4], 4
Теперь посмотрим, каким образом создается значение, которым инициализируется переменная:
  1. .text:0043B810 sub_43B810      proc near
  2. .text:0043B810                 mov     al, [ecx+14Bh]
  3. .text:0043B816                 retn
  4. .text:0043B816 sub_43B810      endp
Нам нужно сделать, чтобы тут в любом случае возвращался правильный результат, то есть AL=1. Для этого заменяем команду по адресу 0043B810 на MOV AL,1 и остаток команды добиваем NOP'ами. Сохраняем изменения, запускаем.

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

Все триальные надписи, а также пункты меню, относящиеся к регистрации, из интерфейса пропали. Триальное окно при старте тоже не появляется. В заголовке окна красуется надпись "Pro". При переводе времени вперед в интерфейсе появляются надписи "Expired". За них отвечает код, расположенный немного выше:
  1. .text:0043F958                 mov     [ebp+var_4], 0
  2. ; Вызвать функцию проверки
  3. .text:0043F95F                 call    sub_43B790
  4. .text:0043F964                 mov     esi, [ebp+Memory]
  5. ; Сохранить ее результат в переменной
  6. .text:0043F967                 mov     [ebp+var_D], al
  7. .text:0043F96A                 or      edi, 0FFFFFFFFh
  8. .text:0043F96D                 mov     [ebp+var_4], 1
  9. .text:0043F974                 test    esi, esi
  10. .text:0043F976                 jz      short loc_43F9A7
  11. .text:0043F978                 mov     ecx, edi
  12. .text:0043F97A                 lock xadd [esi+4], ecx
  13. .text:0043F97F                 dec     ecx
  14. .text:0043F980                 setnz   al
  15. ...
  16. ...
  17. ...
  18. ; Проверить значение переменной
  19. .text:0043F9A7                 cmp     [ebp+var_D], 0
  20. .text:0043F9AB                 mov     [ebp+var_4], 0FFFFFFFFh
  21. ; Если оно не равно 0, то продолжить дальше
  22. .text:0043F9B2                 jnz     short loc_43FA06
  23. .text:0043F9B4                 mov     ecx, [ebx+48h]
  24. .text:0043F9B7                 push    1
  25. .text:0043F9B9                 mov     eax, [ecx]
  26. .text:0043F9BB                 call    dword ptr [eax+2Ch]
  27. .text:0043F9BE                 mov     ecx, [ebx+4Ch]
  28. .text:0043F9C1                 push    1
  29. .text:0043F9C3                 mov     eax, [ecx]
  30. .text:0043F9C5                 call    dword ptr [eax+2Ch]
  31. .text:0043F9C8                 mov     ecx, [ebx+50h]
  32. .text:0043F9CB                 push    0
  33. .text:0043F9CD                 mov     eax, [ecx]
  34. .text:0043F9CF                 call    dword ptr [eax+2Ch]
  35. .text:0043F9D2                 push    0FFFFFFFFh
  36. ; Вывести строку "Expired"
  37. .text:0043F9D4                 push    0
  38. .text:0043F9D6                 push    offset aExpired_0 ; "Expired"
  39. .text:0043F9DB                 lea     eax, [ebp+Memory]
  40. .text:0043F9DE                 mov     ecx, offset off_5C89AC
  41. .text:0043F9E3                 push    eax
В функции по адресу 0043B790, отвечающую за триггер условного перехода, проверяется дата. Если она не выходит за граничные значения, то возвращается AL=1. Чтобы так было всегда, впечатываем в ее начало пару команд MOV AL,1 и RET. Теперь перевод часов ни на что не влияет, превышение триального периода, соответственно, тоже.

Но это еще не все, осталась заключительная косметическая правка - окно информации о лицензии.

Окно информации о лицензии
Окно информации о лицензии

По строке "7-day free trial" обнаруживается следующий код. Часть листинга я пропустил для наглядности.
  1. .text:004391E1                 add     esp, 4
  2. .text:004391E4                 mov     byte ptr [ebp+var_4], 0
  3. ; Проверить регистр ESI
  4. .text:004391E8                 test    esi, esi
  5. ; Если оно равно 0, то вывести строки "7-day free trial"
  6. .text:004391EA                 jz      loc_43936E
  7. ; Вывести информацию о владельце лицензии
  8. .text:004391F0                 lea     eax, [ebp+var_40]
  9. .text:004391F3                 push    eax
  10. .text:004391F4                 call    sub_43AD40
  11. .text:004391F9                 mov     eax, [eax]
  12. ...
  13. ...
  14. ...
  15. .text:00439357                 dec     eax
  16. .text:00439358                 setnz   al
  17. .text:0043935B                 test    al, al
  18. .text:0043935D                 jnz     short loc_439368
  19. .text:0043935F                 push    ecx             ; Memory
  20. .text:00439360                 call    j_free
  21. .text:00439365                 add     esp, 4
  22. .text:00439368                 mov     byte ptr [ebp+var_4], 0
  23. .text:0043936C                 jmp     short loc_4393D4
  24. .text:0043936E ; -----------------------------------------------
  25. .text:0043936E loc_43936E:
  26. .text:0043936E                 push    10h
  27. .text:00439370                 push    offset a7DayFreeTria_0
  28. ; "7-day free trial"
  29. .text:00439375                 call    ds:?fromAscii_helper@QString
  30. .text:0043937B                 add     esp, 8
  31. .text:0043937E                 mov     [ebp+var_2C], eax
  32. .text:00439381                 mov     ecx, [ebx+18h]
  33. .text:00439384                 lea     eax, [ebp+var_2C]
  34. .text:00439387                 mov     esi, ds:?setText@QLabel
  35. .text:0043938D                 push    eax
  36. .text:0043938E                 mov     byte ptr [ebp+var_4], 0Ch
  37. .text:00439392                 mov     ecx, [ecx+1Ch]
Забиваем NOP'ами условный переход по адресу 004391EA и сохраняем изменения. Теперь в окне информации пустые строки вместо триальных надписей. В принципе, если не лениво, можно модифицировать код, чтобы выводились какие-нибудь предустановленные строки, например, ваш никнейм. Но я считаю, что цель уже достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

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

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

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