Blog. Just Blog

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

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

Программа CoinManage Deluxe - каталогизатор монет с готовой базой, в основном по монетам США, Канады и Великобритании. На ознакомление дается 30 дней, после чего требуется оплата. Лично я считаю, что лучше держать в запасе вариант программы, которая эту оплату не требует. А то мало ли что, как говорил один политический деятель: "Ночью наши ученые чуть-чуть изменят гравитационное поле Земли..."

Забираем с офсайта дистрибутив. Размер файла внушительный, но это из-за большого объема каталогов с картинками. Устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его в дизассемблер. При запуске программы первым делом появляется триальное окно:

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

А в окне "О программе" наблюдается надпись, что программа не зарегистрирована.

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

Строка обнаруживается в ресурсах под индексом 543 или 21Fh в шестнадцатеричной системе. Рядышком строка, которая должна появляться у зарегистрированной программы. У нее, соответственно, будет индекс 542 или 21Eh.

Строки в ресурсах
Строки в ресурсах

Поищем в листинге дизассемблера код, где каким-то образом используются эти индексы. Обнаружится следующее:
  1. .text:00402690                 mov     [ebp-224h], ebx
  2. .text:00402696                 mov     ecx, offset dword_AD5DD0
  3. ; Вызвать функцию проверки
  4. .text:0040269B                 call    sub_43E3A0
  5. .text:004026A0                 lea     ecx, [ebx+578h]
  6. ; Если EAX=0, то вывести надпись о незарегистрированной версии
  7. .text:004026A6                 test    eax, eax
  8. .text:004026A8                 jnz     short loc_4026B9
  9. ; Индекс строки в ресурсах
  10. .text:004026AA                 push    21Fh
  11. .text:004026AF                 call    loc_403F50
  12. .text:004026B4                 jmp     loc_402761
  13. .text:004026B9 ; ---------------------------------------------
  14. .text:004026B9 loc_4026B9:
  15. ; Индекс строки в ресурсах
  16. .text:004026B9                 push    21Eh
  17. .text:004026BE                 call    loc_403F50
  18. .text:004026C3                 call    sub_72BC5E
  19. .text:004026C8                 mov     ecx, eax
  20. .text:004026CA                 test    ecx, ecx
  21. .text:004026CC                 jz      loc_402C0C
  22. .text:004026D2                 mov     eax, [ecx]
  23. .text:004026D4                 call    dword ptr [eax+0Ch]
  24. .text:004026D7                 lea     esi, [eax+10h]
  25. .text:004026DA                 mov     [ebp-228h], esi
  26. .text:004026E0                 xor     eax, eax
  27. .text:004026E2                 mov     dword ptr [ebp-4], 0
Тут все просто. Функция проверки, по ее результату грузится или строка об отсутствии регистрации, или строка, что регистрация имеется. Теперь давайте посмотрим на саму функцию проверки.
  1. .text:0043E3A0 sub_43E3A0      proc near
  2. .text:0043E3A0                 push    ebp
  3. .text:0043E3A1                 mov     ebp, esp
  4. .text:0043E3A3                 sub     esp, 14h
  5. .text:0043E3A6                 mov     eax, dword_AC4080
  6. .text:0043E3AB                 xor     eax, ebp
  7. .text:0043E3AD                 mov     [ebp+var_4], eax
  8. .text:0043E3B0                 push    esi
  9. ; Какой-то идентификатор приложения
  10. .text:0043E3B1                 push    offset aC6hiocca7xljmb
  11. ; "c6hiocca7xljmbpq2gnzayzbttjnu3a"
  12. .text:0043E3B6                 mov     esi, ecx
  13. .text:0043E3B8                 mov     [ebp+var_14], 10h
  14. .text:0043E3BF                 mov     [ebp+var_C], 5Ah
  15. .text:0043E3C6                 mov     [ebp+var_8], 0Eh
  16. .text:0043E3CD                 mov     [ebp+var_10], 1
  17. .text:0043E3D4                 call    ds:TA_GetHandle
  18. .text:0043E3DA                 lea     ecx, [ebp+var_14]
  19. .text:0043E3DD                 push    ecx
  20. .text:0043E3DE                 push    eax
  21. ; Проверить подлинность
  22. .text:0043E3DF                 call    ds:TA_IsGenuineEx
  23. .text:0043E3E5                 add     esp, 0Ch
  24. .text:0043E3E8                 test    eax, eax
  25. ; Регистрация имеется
  26. .text:0043E3EA                 jz      short loc_43E416
  27. ; ... и еще три варианта развития событий с положительным результатом
  28. .text:0043E3EC                 cmp     eax, 16h
  29. .text:0043E3EF                 jz      short loc_43E416
  30. .text:0043E3F1                 cmp     eax, 4
  31. .text:0043E3F4                 jz      short loc_43E416
  32. .text:0043E3F6                 cmp     eax, 15h
  33. .text:0043E3F9                 jz      short loc_43E416
  34. ; Регистрации нет
  35. .text:0043E3FB                 mov     dword ptr [esi+58Ch], 0
  36. .text:0043E405                 xor     eax, eax
  37. .text:0043E407                 pop     esi
  38. .text:0043E408                 mov     ecx, [ebp+var_4]
  39. .text:0043E40B                 xor     ecx, ebp
  40. .text:0043E40D                 call    sub_8A2233
  41. .text:0043E412                 mov     esp, ebp
  42. .text:0043E414                 pop     ebp
  43. .text:0043E415                 retn
  44. .text:0043E416 ; ---------------------------------------
  45. .text:0043E416 loc_43E416:
  46. .text:0043E416                 mov     ecx, [ebp+var_4]
  47. ; Регистрация имеется
  48. .text:0043E419                 mov     eax, 1
  49. .text:0043E41E                 mov     dword ptr [esi+58Ch], 1
  50. .text:0043E428                 xor     ecx, ebp
  51. .text:0043E42A                 pop     esi
  52. .text:0043E42B                 call    sub_8A2233
  53. .text:0043E430                 mov     esp, ebp
  54. .text:0043E432                 pop     ebp
  55. .text:0043E433                 retn
  56. .text:0043E433 sub_43E3A0      endp
По коду видно, что тут все подвязано на результате вызова функции TA_IsGenuineEx. Дизассемблер любезно подсказывает нам, что она импортируется из динамической библиотеки TurboActivate.dll.
  1. .idata:0091B7B8 ;
  2. .idata:0091B7B8 ; Imports from TurboActivate.dll
  3. .idata:0091B7B8 ;
  4. .idata:0091B7B8                 extrn TA_GetHandle:dword
  5. .idata:0091B7BC                 extrn TA_TrialDaysRemaining:dword
  6. .idata:0091B7C0                 extrn TA_Deactivate:dword
  7. .idata:0091B7C4                 extrn TA_IsGenuineEx:dword
  8. .idata:0091B7C8                 extrn TA_UseTrial:dword
  9. .idata:0091B7CC                 extrn TA_GetPKey:dword
Действительно, такая библиотека обнаруживается в папке с программой. Файл также ничем не упакован, отправляем его в дизассемблер за компанию к главному исполняемому файлу. По характерному названию файла и данным из версии можно узнать, что это внешний модуль защиты для премиальных разработчиков высокотехнологичного программного обеспечения от компании wyDay, которая вот уже более десятка лет успешно решает задачи клиентов по всему миру. Все, дизассемблер закончил анализ dll-ки, выдыхаем. Находим в листинге функцию TA_IsGenuineEx ...
  1. .text:10023D28 TA_IsGenuineEx  proc near
  2. .text:10023D28                 push    70h
  3. .text:10023D2A                 mov     eax, offset byte_100AE232
  4. .text:10023D2F                 call    sub_1005350C
  5. .text:10023D34                 mov     esi, [ebp+0Ch]
  6. .text:10023D37                 test    esi, esi
  7. .text:10023D39                 jz      loc_10023DCF
  8. .text:10023D3F                 push    10h
  9. .text:10023D41                 pop     edi
  10. .text:10023D42                 cmp     [esi], edi
  11. .text:10023D44                 jnz     loc_10023DCF
  12. .text:10023D4A                 mov     ecx, [ebp+8]
  13. .text:10023D4D                 call    sub_1002379F
  14. .text:10023D52                 mov     ebx, eax
  15. .text:10023D54                 test    ebx, ebx
  16. .text:10023D56                 jnz     short loc_10023D5C
  17. .text:10023D58                 push    1Bh
  18. .text:10023D5A                 jmp     short loc_10023DD1
  19. .text:10023D5C ; ----------------------------------------
  20. .text:10023D5C loc_10023D5C:
  21. .text:10023D5C                 lea     eax, [ebx+9Ch]
  22. .text:10023D62                 mov     ecx, eax
  23. .text:10023D64                 mov     [ebp-7Ch], eax
  24. .text:10023D67                 call    sub_10019DA9
  25. .text:10023D6C                 cmp     dword ptr [esi+4], 3
  26. .text:10023D70                 ja      short loc_10023DBC
  27. .text:10023D72                 push    68h
  28. .text:10023D74                 lea     eax, [ebp-78h]
  29. .text:10023D77                 push    0
  30. .text:10023D79                 push    eax
  31. .text:10023D7A                 call    sub_1007E7C0
  32. .text:10023D7F                 add     esp, 0Ch
  33. .text:10023D82                 lea     ecx, [ebp-78h]
  34. .text:10023D85                 push    dword ptr [ebx+98h]
  35. .text:10023D8B                 push    ebx
  36. .text:10023D8C                 call    sub_10003E6C
  37. .text:10023D91                 mov     eax, [esi+4]
  38. .text:10023D94                 shr     eax, 1
  39. .text:10023D96                 and     al, 1
  40. .text:10023D98                 movzx   eax, al
  41. .text:10023D9B                 push    eax
  42. .text:10023D9C                 mov     al, [esi+4]
  43. .text:10023D9F                 and     al, 1
  44. .text:10023DA1                 movzx   eax, al
  45. .text:10023DA4                 push    eax
  46. .text:10023DA5                 push    0
  47. .text:10023DA7                 push    dword ptr [esi+0Ch]
  48. .text:10023DAA                 push    dword ptr [esi+8]
  49. .text:10023DAD                 call    sub_1000648E
  50. .text:10023DB2                 lea     ecx, [ebp-78h]
  51. .text:10023DB5                 mov     edi, eax
  52. .text:10023DB7                 call    sub_1001072A
  53. .text:10023DBC loc_10023DBC:
  54. .text:10023DBC                 mov     ecx, [ebp-7Ch]
  55. .text:10023DBF                 mov     dword ptr [ebp-4], 1
  56. .text:10023DC6                 call    sub_10002DDE
  57. .text:10023DCB                 mov     eax, edi
  58. .text:10023DCD                 jmp     short loc_10023DD2
  59. .text:10023DCF ; ------------------------------------------
  60. .text:10023DCF loc_10023DCF:
  61. .text:10023DCF                 push    13h
  62. .text:10023DD1 loc_10023DD1:
  63. .text:10023DD1                 pop     eax
  64. .text:10023DD2 loc_10023DD2:
  65. .text:10023DD2                 call    sub_100534B6
  66. .text:10023DD7                 retn
  67. .text:10023DD7 TA_IsGenuineEx  endp
... и впечатываем в ее начало пару команд XOR EAX,EAX и RET. Сохраняем изменения. Теперь у нас есть универсальное решение по обходу регистрации для всех последующих версий CoinManage Deluxe и остальных программ этого разработчика. Ну, по крайней мере до тех пор, пока они будут использовать этот модуль защиты. Или пока ученые чуть-чуть не изменят гравитационное поле Земли.

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

Проверяем результат. Триальное окно при старте программы исчезло, в окне "О программе" красуется надпись о регистрации программы, перевод часов на пару месяцев вперед на работоспособность не влияет. Цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
Илья (25.05.2023 в 11:46):
Это не велосипедный замок. Тут и контроль целостности распаковщика и антиотладочные приёмы.
ManHunter (25.04.2023 в 16:31):
Я велосипедными замками не занимаюсь
Илья (25.04.2023 в 15:41):
Здравствуйте. Был ли у вас опыт взлома программ, накрытыми CodeSafe?
voffka (03.04.2023 в 09:36):
Довольно распространенная система лицензирования.
На оф. сайте можно много чего интересного почерпнуть
https://wyday.com/limelm/help/...ing-started/

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

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

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