Blog. Just Blog

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

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

Программа ScriptCryptor Compiler от Abyssmedia предназначена для компиляции скриптов VBScript и JavaScript в самостоятельные EXE-файлы, при этом их исходные тексты шифруются. Откомпилированные скрипты могут работать без вспомогательных системных файлов cscript.exe и wscript.exe, при выполнении не создается никаких временных файлов, все данные берутся из памяти. Об остальных функциях, если интересно, можете почитать на сайте. Ну а поскольку программа ScriptCryptor Compiler появилась в этом разделе блога, значит что-то с ней не так.

Качаем дистрибутив, устанавливаем, запускаем. Незарегистрированная версия компилятора создает EXE-файлы с напоминалкой, что они сделаны триальной версией. Не смертельно, конечно, но напрягает. Открываем окно регистрации, вводим левые данные. Здесь разработчики не наступили на традиционные грабли, программа молча принимает любое имя и серийник без всяких сообщений, даже куда-то их добросовестно сохраняет. Теперь посмотрим исполняемый файл. Он упакован UPX без всяких модификаций, распаковывается обычным "upx -d". Переходим к внутренностям файла. Единственная видимая зацепка для исследования - триальная надпись "UNREGISTERED COPY" в строке статуса программы, но она находится не в коде, а в ресурсах, причем не просто в ресурсах, а в формах Delphi. Можно потратить некоторое время, гоняя программу в DeDe, а можно наудачу предположить, что где-то есть строка типа "REGISTERED COPY" или типа того. И действительно, по паттерну "registered" находится что-то похожее:

Строка о зарегистрированности программы
Строка о зарегистрированности программы

На нее ссылается следующий код:
  1. .text:00504963                 mov     edx, off_534538
  2. .text:00504969                 mov     edx, [edx+4]
  3. .text:0050496C                 mov     eax, off_534538
  4. .text:00504971                 mov     eax, [eax]
  5. ; Вызвать какую-то функцию проверки
  6. .text:00504973                 call    sub_528688
  7. ; Если она вернула в AL не ноль, то программа считается зарегистрированной
  8. .text:00504978                 test    al, al
  9. .text:0050497A                 jz      short loc_5049D3
  10. .text:0050497C                 mov     edx, off_534538
  11. .text:00504982                 mov     edx, [edx]
  12. .text:00504984                 mov     eax, [ebx+380h]
  13. .text:0050498A                 call    sub_45F530
  14. .text:0050498F                 mov     edx, offset aRegisteredVe_1
  15. ; Строка "Registered Version"
  16. .text:00504994                 mov     eax, [ebx+388h]
  17. .text:0050499A                 call    sub_45F530
  18. .text:0050499F                 xor     edx, edx
  19. .text:005049A1                 mov     eax, [ebx+370h]
  20. .text:005049A7                 call    sub_45F420
  21. .text:005049AC                 xor     edx, edx
  22. .text:005049AE                 mov     eax, [ebx+360h]
  23. .text:005049B4                 mov     ecx, [eax]
Теперь посмотрим процедуру проверки в дизассемблере и параллельно пройдем ее под отладчиком. Обратите внимание, что эта процедура вызывается только из одного места, и причем даже не при старте программы, а при открытии окна регистрации. Значит это не единственная проверка, и просто пропатчить ее нельзя. Я прокомментировал в коде все важные участки.
  1. .text:00528688                 push    ebp
  2. .text:00528689                 mov     ebp, esp
  3. .text:0052868B                 xor     ecx, ecx
  4. .text:0052868D                 push    ecx
  5. .text:0052868E                 push    ecx
  6. .text:0052868F                 push    ecx
  7. .text:00528690                 push    ecx
  8. .text:00528691                 push    ebx
  9. .text:00528692                 push    esi
  10. .text:00528693                 push    edi
  11. .text:00528694                 mov     [ebp+var_4], edx
  12. .text:00528697                 mov     eax, [ebp+var_4]
  13. .text:0052869A                 call    sub_40541C
  14. .text:0052869F                 xor     eax, eax
  15. .text:005286A1                 push    ebp
  16. .text:005286A2                 push    offset loc_528714
  17. .text:005286A7                 push    dword ptr fs:[eax]
  18. .text:005286AA                 mov     fs:[eax], esp
  19. .text:005286AD                 xor     ebx, ebx
  20. ; Вот здесь ссылка на интересный блок данных. Он представляет собой большое
  21. ; количество шестнадцатеричных цифр.
  22. .text:005286AF                 mov     esi, offset aE9210182c802b9
  23. ; "e9210182c802b90244f6d8b9c2f56036ca39a17"...
  24. .text:005286B4                 lea     eax, [ebp+var_8]
  25. .text:005286B7                 call    sub_404F9C
  26. .text:005286BC                 lea     ecx, [ebp+var_C]
  27. .text:005286BF                 mov     edx, [ebp+var_4]
  28. .text:005286C2                 mov     eax, 103h
  29. ; Если дошагать сюда под отладчиком, то видно, что берется введенный
  30. ; серийный номер, и из него вычисляется 64-битное число. Его видно в
  31. ; стеке. Анализаторы криптоалгоритмов показывают наличие в коде функции
  32. ; расчета MD5, и этот расчет выполняется в следующей функции.
  33. .text:005286C7                 call    sub_481870
  34. ; Проверим нашу догадку, рассчитав MD5 от введенного "левого" серийника
  35. ; при помощи любой сторонней программы, строка будет в точности равна
  36. ; вычисленной в предыдущей функции. Значит для проверки берется хэш MD5
  37. ; от введенного серийного номера.
  38. .text:005286CC                 xor     edi, edi
  39. .text:005286CE loc_5286CE:
  40. .text:005286CE                 lea     eax, [ebp+var_10]
  41. .text:005286D1                 mov     edx, edi
  42. .text:005286D3                 add     edx, edx
  43. .text:005286D5                 add     edx, edx
  44. .text:005286D7                 lea     edx, [esi+edx*8]
  45. .text:005286DA                 mov     ecx, 20h
  46. ; Взять от блока данных 32 символа
  47. .text:005286DF                 call    sub_40520C
  48. .text:005286E4                 mov     eax, [ebp+var_10]
  49. .text:005286E7                 mov     edx, [ebp+var_C]
  50. ; Сравнить блок с рассчитанным хэшем от серийного номера
  51. .text:005286EA                 call    sub_4053C4
  52. ; Если не совпадает, то взять сделующие 32 символа и т.д. до окончания
  53. ; блока данных
  54. .text:005286EF                 jnz     short loc_5286F3
  55. ; Найдено совпадение
  56. .text:005286F1                 mov     bl, 1
  57. .text:005286F3 loc_5286F3:
  58. .text:005286F3                 inc     edi
  59. .text:005286F4                 cmp     edi, 65h
  60. ; Проверено 65h блоков по 32 байта?
  61. .text:005286F7                 jnz     short loc_5286CE
  62. ; Совпадений не найдено, EAX=0 и на выход
  63. .text:005286F9                 xor     eax, eax
  64. .text:005286FB                 pop     edx
  65. .text:005286FC                 pop     ecx
  66. .text:005286FD                 pop     ecx
  67. .text:005286FE                 mov     fs:[eax], edx
  68. .text:00528701                 push    offset loc_52871B
  69. .text:00528706 loc_528706:
  70. .text:00528706                 lea     eax, [ebp+var_10]
  71. .text:00528709                 mov     edx, 4
  72. .text:0052870E                 call    sub_404FC0
  73. .text:00528713                 retn
  74. .text:00528714 ; --------------------------------------------------
  75. .text:00528714 loc_528714:
  76. .text:00528714                 jmp     loc_404830
  77. .text:00528719 ; --------------------------------------------------
  78. .text:00528719                 jmp     short loc_528706
  79. .text:0052871B ; --------------------------------------------------
  80. .text:0052871B loc_52871B:
  81. .text:0052871B                 mov     eax, ebx
  82. .text:0052871D                 pop     edi
  83. .text:0052871E                 pop     esi
  84. .text:0052871F                 pop     ebx
  85. .text:00528720                 mov     esp, ebp
  86. .text:00528722                 pop     ebp
  87. .text:00528723                 retn
Из этого кода можно узнать следующее: сперва от введенного серийного номера вычисляется хэш MD5. В самой программе хранится несколько десятков заранее сгенерированных хэшей от правильных серийных номеров, и проверка регистрации сводится к поочередному сравнению рассчитанного хэша с готовыми. Найдено совпадение - программа зарегистрирована, если не найдено - работает в триальном режиме. Такая схема регистрации используется в некоторых других программах, и определенная логика тут тоже есть. Алгоритм MD5 необратим, и взламывается только прямым перебором, а при достаточной длине серийного номера его подбор даже на современных компьютерах займет недопустиимо длительное время. Обход защиты в нашем случае будет заключаться в том, что мы подменим первые 32 байта блока готовых хэшей на нужные нам данные. Придумаем какой-нибудь красивый серийник, например, "PERM-CRACK-LABORATORY-RULEZ", и посчитаем от него хэш MD5. Получится текстовая строка "7dd47442009f46f61db100b3e3b1a510". Заменим ей первые 32 символа блока:

Заменяем первый хэш в блоке
Заменяем первый хэш в блоке

Сохраним изменения, запустим файл, и попытаемся его зарегистрировать с нашим красивым серийным номером. Получаем радостное сообщение "Registration Successful!", а текст в строке состояния меняется на "Registered Version". Что, собственно, нам и надо было получить.

Регистрация программы
Регистрация программы

При повторном запуске кнопка регистрации уже неактивна.

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

Для очистки совести создадим какой-нибудь простой скрипт, откомпилируем его и запустим. Никаких сообщений о триальности больше нет. По такой же схеме с заменой хэша обходится защита и других программ компании Abyssmedia.

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

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

Комментарии

Отзывы посетителей сайта о статье
Ламер (25.02.2013 в 19:38):
Вы - мой герой!..
Danila (31.03.2012 в 18:45):
Кстати, вот пример, как разработчик пытается защитить свои творения:
Ghost Installer Studio PRO 4.8
http://www.ethalone.com/downlo...tudioPro.exe
В Интернете доступны только демо-версии данного продукта, якобы "крякнутые" для создания видимости его полной функциональности. А валидного ключа, до сих пор, никто не видел. Разрабы! Учитесь, а не рыдайте!
Danila (31.03.2012 в 18:23):
IMXO! Чтобы потребитель покупал лицензионный софт, необходимо чтобы разработчик и, только разработчик позаботился о защите и сохранности своего творения. А то разбрасывают свои разработки, где попало, а затем кричат на каждом углу: - " Украаали!!!!". Работать надо качественно и народ к Вам возможно потянется! ManHunter оказывает Вам (разрабам) бесплатную услугу, за которую Вы должны ему платить, так как сами не позаботились о защите своих творений.
ManHunter (21.12.2009 в 17:17):
Abyssmedia, я предложил свою помощь в совершенствовании защиты, но видимо не надо. Дело хозяйское.
Abyssmedia (21.12.2009 в 17:12):
NightFlame,

То что вам не понятно - мне очевидно. Я не знаю идиотов, которые будут покупать компайлер для создания троянов.

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

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

ManHunter,

С UPX не угадали. Лицензии надо внимательнее читать. Использование GPL софта для упаковки не обязывает раскрывать свой код. Если я их исходники не использую и не линкуюсь с их кодом, то все в порядке. Только если я буду распространять их бинарник и вызывать его из своей программы, то буду обязан раскрыть код.
NightFlame (21.12.2009 в 15:43):
>Я поясню к чему это приводит:
Пояснили - нихрена не понятно!
>- программу ломают
И?
>- ломанную версию используют для компиляции троянов
А лицензионную не могут использовать для той же цели?
>- антивирусы заносят ее в свои базы
Пьяный бред, какой-то! GCC, MS VS, BCPPB, BDelphi [и файлы ими скомпилированные] почему-то не заносят "в свои базы" [что за базы такие ещё б знать - может базы подозрительного ПО?], а вирей на них написано - ScriptCryptor не настолько популярен, чтоб с его помощью что-либо компилировать. Кстати, как вы думаете, на каком принципе основано антивирусное ПО и их так называемые базы?
>- страдают легальные пользователи
Пользователи страдают от того, что изначально разработчик не позаботился о защите своего продукта, а не от того, что продукт сломали. Не можете сами - множество банков предоставляют кредиты - берите и нанимайте "спецов", после этого можете спать спокойно, если сломают - виноваты не вы ;)!
>Любая защита не устоит перед кардерами :-(
С каких пор кардеры занимаются взломом ПО? [может крэкеры - "crackers"?]
>По такой же схеме с заменой хэша обходится защита и других программ компании Abyssmedia.
Какой вывод следует из вышенаписанной статьи - пора дорабатывать защиту [хотя скорее - переписывать с нуля]! А не плакаться о ненавистных "кардерах".
ManHunter (18.12.2009 в 02:01):
Кстати, если уж совсем заниматься буквоедством, то используемый для упаковки пакер UPX, распространяется по лицензии GNU GPL. А GNU GPL требует распространения с двоичными файлами (в том числе неизменными) исходного кода или письменного обязательства его предоставить (своего или чужого; способы зависят от версии лицензии). Так что продукты, которые им накрываются, должны распространяться с открытым кодом.
Но это так, лирика :)
ramirez (11.12.2009 в 10:53):
Abyssmedia,
если вещь ломкая, то испытатель не виноват в этом.

грех отказываться от помощи многоопытного спеца.
ManHunter (11.12.2009 в 07:56):
Я не первый год занимаюсь варезом, и за все это время в природе был замечен только 1 (один!) релиз с ключом к одному продукту Abyssmedia. Остальное только "cracked exe". И раз я говорю, что мне есть что подсказать на этот счет, то я это не просто так говорю.
Abyssmedia (11.12.2009 в 02:55):
Я поясню к чему это приводит:

- программу ломают
- ломанную версию используют для компиляции троянов
- антивирусы заносят ее в свои базы
- страдают легальные пользователи

Любая защита не устоит перед кардерами :-(
ManHunter (10.12.2009 в 00:16):
Нет, просто указываю на слабые места в вашей защите, и как их можно обойти. Соответственно, на основе этой статьи вы вполне можете их учесть и устранить. Ничего личного.
Ну а если интересно, то могу даже подсказать пару приемов.
Abyssmedia (10.12.2009 в 00:15):
И что, считаете себя народным героем?

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

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

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