Blog. Just Blog

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

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

Программа MavorsGuard предназначена для защиты PHP-скриптов от изучения и модификации. Достигается это путем шифрования исходного текста с последующей его расшифровкой непосредственно во время выполнения. За все это требуется выложить некоторую сумму денег.

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

MavorsGuard 1.50MavorsGuard 1.50

MavorsGuard.1.50.zip (97,396 bytes)

Сразу скажу, что результаты его работы, то есть защищенные скрипты, все равно требуют установить на сервер так называемые загрузчики, с помощью которых PHP расшифровывает скрипты. В комплекте они тоже есть. Подробнее узнать об этом, вероятно, можно было на офсайте, но с закрытием проекта сделать это уже невозможно. Поэтому просто достанем некромантский посох и поковыряемся в мертвой тушке несостоявшегося защитничка.

Основной исполняемый файл написан на .NET, поэтому для дальнейших исследований кроме посоха нам понадобится также уже известный декомпилятор .NET Reflector. Откроем в нем исполняемый файл и поищем что-нибудь, связанное с активацией. Очевидно, что это где-то в ActivationWindow:

Обработчик окна активации программы
Обработчик окна активации программы

В глаза сразу бросается метод checkLicenseKey. Клик мышкой на названии метода и мы уже наблюдаем его исходный код:

Функция проверки правильности лицензии
Функция проверки правильности лицензии

Единственное, что здесь используется, это объект Security. Еще один клик мышкой.

Список валидных ключей
Список валидных ключей

Код на скриншоте не очень понятен, так как написан в одну строчку, я приведу его в текстовом виде, чтобы можно было насладиться красотой момента:

public Security() {
    this.a = Environment.SystemDirectory.ToString();
    this.b = "mg0x32sk.dll";
    this.c = new LicenseKeys[] {
        new LicenseKeys("G5BPH-T2TMH-QDAE5-734DH-LPHTS"),
        new LicenseKeys("LP23H-12KLM-MHQ6S-3PFIE-LOSR9"),
        new LicenseKeys("KDWEK-SDF34-4FG6S-SDF31-LCV8D"),
        new LicenseKeys("SWE34-1F04S-0046D-S2350-KLWNM"),
        new LicenseKeys("EWODF-23KD8-WNSL4-QISD9-91JKE"),
        new LicenseKeys("A0011-02KS9-92PL4-QRWE3-47LS1")
    };
}

Используется a) системная директория бэ) нечто под названием mg0x32sk.dll и цэ) список возможных серийный номеров для активации. Даже не надо предполагать, так как очевидно, что для регистрации программы используется один из шести заранее известных серийников, а регистрация сохраняется в лучших мудацких традициях шароварного программирования в файл mg0x32sk.dll в системную директорию. Либо целых шесть человек успели купить это чудо программистской мысли, либо... "на этом мысль останавливается" (С) Масяня.

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

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

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

Программа работает в зарегистрированном режиме
Программа работает в зарегистрированном режиме

С основной программой разобрались, можно применить ее на практике. Вот так выглядит скрипт, обработанный MavorsGuard. Он состоит из вызова единственной функции mgExecute с зашифрованной строкой в качестве параметра.

Вид зашифрованного скрипта
Вид зашифрованного скрипта

Теперь давайте разберемся с его модулями расшифровки. Напомню, что они используются для расшифровки скриптов при их выполнении на сервере. Для примера я открыл в дизассемблере самый последний загрузчик MavorsGuard_php5.3.5.so. Файл под линукс и, соответственно, имеет формат ELF. Благо файл совсем крохотный и содержит единственную интересную функцию - decode, которая, в свою очередь, проецируется в PHP как mgExecute.
  1. .text:000006EA loc_6EA:
  2. .text:000006EA                 mov     eax, [ebp+var_10]
  3. .text:000006ED                 add     eax, [ebp+arg_0]
  4. .text:000006F0                 movzx   eax, byte ptr [eax]
  5. .text:000006F3                 cmp     al, 5Ch
  6. .text:000006F5                 jnz     short loc_71D
  7. .text:000006F7                 mov     eax, [ebp+var_10]
  8. .text:000006FA                 add     eax, 1
  9. .text:000006FD                 add     eax, [ebp+arg_0]
  10. .text:00000700                 movzx   eax, byte ptr [eax]
  11. .text:00000703                 cmp     al, 27h
  12. .text:00000705                 jz      short loc_717
  13. .text:00000707                 mov     eax, [ebp+var_10]
  14. .text:0000070A                 add     eax, 1
  15. .text:0000070D                 add     eax, [ebp+arg_0]
  16. .text:00000710                 movzx   eax, byte ptr [eax]
  17. .text:00000713                 cmp     al, 22h
  18. .text:00000715                 jnz     short loc_71D
  19. .text:00000717 loc_717:
  20. .text:00000717                 add     [ebp+var_14], 1
  21. .text:0000071B                 jmp     short loc_735
  22. .text:0000071D ; ------------------------------------------------
  23. .text:0000071D loc_71D:
  24. .text:0000071D                 mov     eax, [ebp+var_C]
  25. .text:00000720                 add     eax, [ebp+var_18]
  26. .text:00000723                 mov     edx, [ebp+var_10]
  27. .text:00000726                 add     edx, [ebp+arg_0]
  28. ; Загрузить в EDX символ из зашифрованной строки
  29. .text:00000729                 movzx   edx, byte ptr [edx]
  30. ; Вычесть из него единицу
  31. .text:0000072C                 sub     edx, 1
  32. ; Записать расшифрованный символ обратно
  33. .text:0000072F                 mov     [eax], dl
  34. .text:00000731                 add     [ebp+var_C], 1
  35. .text:00000735 loc_735:
  36. .text:00000735                 add     [ebp+var_10], 1
  37. .text:00000739 loc_739:
  38. .text:00000739                 mov     eax, [ebp+var_10]
  39. .text:0000073C                 cmp     eax, [ebp+size]
  40. .text:0000073F                 jl      short loc_6EA
Долго на код медитировать не пришлось, вся шифровка сводится к тому, что к каждому символу исходного скрипта добавляется единица. При расшифровке, соответственно, эта же единица вычитается. Тестовые скрипты с заранее известным содержимым подтверждают, что используется именно такой алгоритм. Вот так выглядит расшифровщик скриптов, обработанных MavorsGuard, на языке PHP. Расчехлять для такой мелочевки Ассемблер даже западло.
  1. $str='содержимое зашифрованного скрипта';
  2. for($i=0$i<strlen($str); $i++) {
  3.     echo chr(ord($str[$i])-1);
  4. }
Поздравляю, вы прослушали базовый курс некромантии и получили +10 к опыту реверсинга. На примере одной мертвой программы нам удалось еще разок ковырнуть .NET-приложение, чуть-чуть пощупать линуксовые исполняемые файлы, разобраться в алгоритме защиты скриптов внешними модулями MavorsGuard, а также написать для них расшифровщик.

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

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

Комментарии

Отзывы посетителей сайта о статье
Фигаса (22.03.2014 в 18:04):
Гуру епта!
JokerBaD (18.03.2014 в 22:10):
Ваш блог курить одно удовольствие)
Never (13.03.2014 в 18:48):
Ну почему сразу запрос? Вишь как затейливо.
ManHunter (11.03.2014 в 11:27):
Запрос на взлом = бан.
Al (11.03.2014 в 11:26):
С дотнетом всё как-то очень просто получается.

На случай если вам захочется более сложного и нативного ) , попробую предложить spacetime https://web.archive.org/web/20....us/windows/ (в дальнейщем переименован в mathstudio и уже без win версии).
Это нечто среднее между калькулятором и маткадом. От первого понятный интерфейс, от второго решение дифуров и т.п. И всего 1Mb (с практической портабельностью, если бы не привязка к железу).

Именно эта версия, т.к. она раздавалась бесплатно. Но при этом ключ зависит от железа, а серверы регистрации уже не работают, так что на новом компе ей уже не воспользуешься. И вот это дело хотелось бы исправить )
goga (10.03.2014 в 13:46):
Очень интересно)

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

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

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