Blog. Just Blog

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

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

BurnAware Professional - мультимедийный комбайн для работы с CD и DVD дисками, а также образами дисков. Состоит из набора отдельных специализированных утилит, запускаемых из единой оболочки. Без регистрации работа большинства компонентов ограничена по времени, хотя в принципе очень странно делать платным подобный софт, ведь бесплатных аналогов предостаточно.

Забираем с офсайта дистрибутив (или тут) самой максимальной профессиональной редакции, устанавливаем, смотрим что и как.

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

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

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

В окне "О программе" отображается сообщение о незарегистрированной версии. Отправные точки есть. Исполняемый файл ничем не упакован, отправляем его в дизассемблер. Поиском по строчке "Unregistered" выходим на следующий код:
  1. .text:0064A7DB                 mov     eax, [ebp+var_4]
  2. .text:0064A7DE                 call    sub_524D5C
  3. .text:0064A7E3                 mov     eax, [ebp+var_4]
  4. .text:0064A7E6                 mov     eax, [eax+3E8h]
  5. .text:0064A7EC                 mov     edx, offset aBurnawareProfe
  6. ; "BurnAware Professional"
  7. .text:0064A7F1                 call    sub_51CE2C
  8. .text:0064A7F6                 lea     eax, [ebp+var_48]
  9. .text:0064A7F9                 push    eax
  10. .text:0064A7FA                 mov     ecx, offset aUnregisteredEv
  11. ; "Unregistered evaluation version"
  12. .text:0064A7FF                 mov     edx, offset aUnregistered
  13. ; "Unregistered"
  14. .text:0064A804                 mov     eax, offset off_64AB68
  15. .text:0064A809                 call    sub_646994
  16. .text:0064A80E                 mov     edx, [ebp+var_48]
  17. .text:0064A811                 mov     eax, [ebp+var_4]
  18. .text:0064A814                 mov     eax, [eax+408h]
  19. .text:0064A81A                 call    sub_51CE2C
  20. .text:0064A81F                 mov     eax, [ebp+var_4]
  21. .text:0064A822                 mov     eax, [eax+408h]
  22. .text:0064A828                 mov     eax, [eax+74h]
  23. .text:0064A82B                 mov     edx, 0D5h
  24. .text:0064A830                 call    sub_4EFA34
  25. .text:0064A835                 mov     eax, [ebp+var_4]
  26. .text:0064A838                 mov     eax, [eax+408h]
  27. .text:0064A83E                 mov     eax, [eax+84h]
  28. .text:0064A844                 mov     ecx, [eax+0Ch]
  29. .text:0064A847                 add     ecx, ecx
  30. .text:0064A849                 mov     eax, [ebp+var_4]
  31. .text:0064A84C                 mov     eax, [eax+408h]
  32. .text:0064A852                 mov     eax, [eax+84h]
  33. .text:0064A858                 mov     edx, 1
  34. .text:0064A85D                 call    sub_52D5D0
  35. .text:0064A862                 xor     eax, eax
  36. .text:0064A864                 mov     [ebp+var_C], eax
  37. .text:0064A867                 mov     dl, 1
  38. .text:0064A869                 mov     eax, ds:off_4E4328
  39. .text:0064A86E                 call    sub_4E5390
  40. .text:0064A873                 mov     [ebp+var_8], eax
  41. .text:0064A876                 xor     eax, eax
  42. .text:0064A878                 push    ebp
  43. .text:0064A879                 push    offset loc_64AAC0
  44. .text:0064A87E                 push    dword ptr fs:[eax]
  45. .text:0064A881                 mov     fs:[eax], esp
  46. .text:0064A884                 mov     edx, 80000001h
  47. .text:0064A889                 mov     eax, [ebp+var_8]
  48. .text:0064A88C                 call    sub_4E5478
  49. .text:0064A891                 mov     edx, offset aSoftwareBurnaw
  50. ; "Software\\BurnAware\\License"
  51. .text:0064A896                 mov     eax, [ebp+var_8]
  52. ; Запросить ключ реестра
  53. .text:0064A899                 call    sub_4E5610
  54. .text:0064A89E                 test    al, al
  55. ; Ключа нет, программа не зарегистрирована
  56. .text:0064A8A0                 jz      loc_64AAAA
  57. .text:0064A8A6                 mov     edx, offset off_64AE7C
  58. .text:0064A8AB                 mov     eax, [ebp+var_8]
  59. ; Проверить длину строки регистрации
  60. .text:0064A8AE                 call    sub_4E59F8
  61. .text:0064A8B3                 cmp     eax, 5Ah
  62. ; Длина меньше 5Ah символов, программа не зарегистрирована
  63. .text:0064A8B6                 jle     loc_64AAAA
  64. .text:0064A8BC                 push    offset dword_64AE90
  65. .text:0064A8C1                 lea     edx, [ebp+var_54]
  66. .text:0064A8C4                 xor     eax, eax
  67. .text:0064A8C6                 call    sub_405AB0
  68. .text:0064A8CB                 mov     eax, [ebp+var_54]
  69. .text:0064A8CE                 lea     edx, [ebp+var_50]
  70. .text:0064A8D1                 call    sub_423AAC
  71. ; Запустить внешнюю проверку регистрации
  72. .text:0064A8D6                 push    [ebp+var_50]
  73. .text:0064A8D9                 push    offset aAsprlib_exe4
  74. ; "asprlib.exe\" 4"
  75. .text:0064A8DE                 lea     eax, [ebp+var_4C]
  76. .text:0064A8E1                 mov     edx, 3
  77. .text:0064A8E6                 call    sub_4093A4
  78. .text:0064A8EB                 mov     eax, [ebp+var_4C]
  79. .text:0064A8EE                 lea     edx, [ebp+var_C]
  80. .text:0064A8F1                 call    sub_649E0C
  81. .text:0064A8F6                 mov     eax, [ebp+var_C]
  82. .text:0064A8F9                 xor     edx, edx
  83. .text:0064A8FB                 push    edx
  84. .text:0064A8FC                 push    eax
  85. .text:0064A8FD                 lea     eax, [ebp+var_5C]
  86. .text:0064A900                 call    sub_422CB8
  87. .text:0064A905                 mov     eax, [ebp+var_5C]
  88. .text:0064A908                 mov     dx, [eax+6]
  89. .text:0064A90C                 lea     eax, [ebp+var_58]
  90. .text:0064A90F                 call    sub_4090D8
  91. .text:0064A914                 mov     eax, [ebp+var_58]
  92. .text:0064A917                 call    sub_423028
  93. ; Проверить значение кода возврата
  94. .text:0064A91C                 sub     eax, 2
  95. .text:0064A91F                 jz      short loc_64A92F
  96. .text:0064A921                 sub     eax, 2
  97. .text:0064A924                 jz      loc_64A9EF
  98. .text:0064A92A                 jmp     loc_64AAAA
  99. .text:0064A92F ; -----------------------------------------
  100. .text:0064A92F loc_64A92F:
  101. .text:0064A92F                 lea     eax, [ebp+var_60]
  102. .text:0064A932                 push    eax
  103. .text:0064A933                 mov     ecx, offset off_64AECC
  104. .text:0064A938                 mov     edx, offset off_64AF00
  105. .text:0064A93D                 mov     eax, offset aV3_1_2 ; "v3.1.2"
  106. .text:0064A942                 call    sub_646994
  107. .text:0064A947                 mov     edx, [ebp+var_60]
  108. .text:0064A94A                 mov     eax, [ebp+var_4]
  109. .text:0064A94D                 mov     eax, [eax+408h]
  110. .text:0064A953                 call    sub_51CE2C
  111. .text:0064A958                 lea     eax, [ebp+var_64]
  112. .text:0064A95B                 push    eax
  113. .text:0064A95C                 mov     ecx, offset aSingleUserLice
  114. ; "Single user license"
  115. .text:0064A961                 mov     edx, offset aSingle ; "Single"
  116. .text:0064A966                 mov     eax, offset off_64AB68
  117. .text:0064A96B                 call    sub_646994
  118. .text:0064A970                 mov     edx, [ebp+var_64]
  119. .text:0064A973                 mov     eax, [ebp+var_4]
  120. .text:0064A976                 mov     eax, [eax+400h]
Что тут происходит? Сперва инициализируются строки в зависимости от выбранного языка. По умолчанию используется английский язык. Следующим шагом запрашивается ключ реестра с характерным названием "License", после чего проверяется длина полученного результата, если таковой вообще имеется. Длина должна быть не менее 5Ah символов. А вот дальше происходит самое интересное: вызывается файл "asprlib.exe" с параметром "4". Финальными шагами проверяется значение кода возврата после выполнения этого приложения. Значение 2 соответствует лицензии с годовым обновлением, значение 4 - пожизненной лицензии.

Начинаем патчить. Поскольку никаких лицензий у нас не было и нет, то патчим два условных перехода по адресам 0064A8A0 и 0064A8B6. После этого заменяем любой из условных переходов по адресам 0064A91F или 0064A924 на безусловный. Сохраняем изменения, запускаем.

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

Триальное окно при старте осталось, но окно "О программе" заметно преобразилось. Предположу, что за первоначальную проверку должен отвечать похожий на этот код. Поищем другие вхождения строки "asprlib.exe" и участки кода, где это приложение запускается с параметром "4". Обнаруживается очень похожий код:
  1. .itext:00661007                 mov     edx, off_66B210
  2. ; Проверить наличие лицензии
  3. .itext:0066100D                 mov     edx, [edx]
  4. .itext:0066100F                 call    sub_409454
  5. .itext:00661014                 jnz     loc_66121E
  6. .itext:0066101A                 lea     eax, [ebp-1Ch]
  7. .itext:0066101D                 call    sub_649D08
  8. .itext:00661022                 mov     eax, [ebp-1Ch]
  9. .itext:00661025                 mov     edx, off_66B434
  10. .itext:0066102B                 mov     edx, [edx]
  11. .itext:0066102D                 call    sub_409454
  12. .itext:00661032                 jnz     loc_66121E
  13. .itext:00661038                 push    offset dword_6612DC
  14. .itext:0066103D                 lea     edx, [ebp-28h]
  15. .itext:00661040                 xor     eax, eax
  16. .itext:00661042                 call    sub_405AB0
  17. .itext:00661047                 mov     eax, [ebp-28h]
  18. .itext:0066104A                 lea     edx, [ebp-24h]
  19. .itext:0066104D                 call    sub_423AAC
  20. ; Запустить внешнюю проверку регистрации
  21. .itext:00661052                 push    dword ptr [ebp-24h]
  22. .itext:00661055                 push    offset aAsprlib_exe4_0
  23. ; "asprlib.exe\" 4"
  24. .itext:0066105A                 lea     eax, [ebp-20h]
  25. .itext:0066105D                 mov     edx, 3
  26. .itext:00661062                 call    sub_4093A4
  27. .itext:00661067                 mov     eax, [ebp-20h]
  28. .itext:0066106A                 mov     edx, off_66B408
  29. .itext:00661070                 mov     edx, [edx]
  30. .itext:00661072                 add     edx, 638h
  31. .itext:00661078                 call    sub_649E0C
  32. .itext:0066107D                 mov     eax, off_66B408
  33. .itext:00661082                 mov     eax, [eax]
  34. .itext:00661084                 mov     eax, [eax+638h]
  35. .itext:0066108A                 xor     edx, edx
  36. .itext:0066108C                 push    edx
  37. .itext:0066108D                 push    eax
  38. .itext:0066108E                 lea     eax, [ebp-30h]
  39. .itext:00661091                 call    sub_422CB8
  40. .itext:00661096                 mov     eax, [ebp-30h]
  41. .itext:00661099                 mov     dx, [eax+6]
  42. .itext:0066109D                 lea     eax, [ebp-2Ch]
  43. .itext:006610A0                 call    sub_4090D8
  44. .itext:006610A5                 mov     eax, [ebp-2Ch]
  45. .itext:006610A8                 call    sub_423028
  46. ; Проверить значение кода возврата
  47. .itext:006610AD                 sub     eax, 2
  48. .itext:006610B0                 jz      short loc_6610B7
  49. .itext:006610B2                 sub     eax, 2
  50. .itext:006610B5                 jnz     short loc_6610D5
  51. .itext:006610B7 loc_6610B7:
  52. .itext:006610B7                 mov     eax, off_66B408
  53. .itext:006610BC                 mov     eax, [eax]
  54. .itext:006610BE                 add     eax, 634h
  55. .itext:006610C3                 mov     edx, off_66B040
  56. .itext:006610C9                 mov     edx, [edx]
Структура кода такая же. Два условных перехода с проверками, вызов внешнего приложения для проверки регистрации, затем проверка значений кода возврата. NOP'им два условных перехода по адресам 00661014 и 00661032, заменяем условный переход по адресу 006610B0 на безусловный. Сохраняем изменения, запускаем программу. Теперь никаких окон, никаких триальных надписей в интерфейсе, регистрация в окне "О программе". Перевод часов на месяц вперед тоже не влияет на работоспособность. Цель достигнута.

Но это только для оболочки, каждую другую компоненту приложения придется доводить до ума точно таким же образом, оба фрагмента кода там аналогичные. Да, процесс займет какое-то время, но результат гарантирован.

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

Комментарии

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

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

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

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