Исследование защиты программы MavorsGuard
Скриншот программы MavorsGuard
Программа MavorsGuard предназначена для защиты PHP-скриптов от изучения и модификации. Достигается это путем шифрования исходного текста с последующей его расшифровкой непосредственно во время выполнения. За все это требуется выложить некоторую сумму денег.
Офсайт уже давно сдох, проект закрыт, ссылки на закачку дистрибутива найти не так просто, но у меня в загашнике он остался. Файл небольшой, так что можете скачать его прямо отсюда.
Сразу скажу, что результаты его работы, то есть защищенные скрипты, все равно требуют установить на сервер так называемые загрузчики, с помощью которых 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.
Code (Assembler) : Убрать нумерацию
- .text:000006EA loc_6EA:
- .text:000006EA mov eax, [ebp+var_10]
- .text:000006ED add eax, [ebp+arg_0]
- .text:000006F0 movzx eax, byte ptr [eax]
- .text:000006F3 cmp al, 5Ch
- .text:000006F5 jnz short loc_71D
- .text:000006F7 mov eax, [ebp+var_10]
- .text:000006FA add eax, 1
- .text:000006FD add eax, [ebp+arg_0]
- .text:00000700 movzx eax, byte ptr [eax]
- .text:00000703 cmp al, 27h
- .text:00000705 jz short loc_717
- .text:00000707 mov eax, [ebp+var_10]
- .text:0000070A add eax, 1
- .text:0000070D add eax, [ebp+arg_0]
- .text:00000710 movzx eax, byte ptr [eax]
- .text:00000713 cmp al, 22h
- .text:00000715 jnz short loc_71D
- .text:00000717 loc_717:
- .text:00000717 add [ebp+var_14], 1
- .text:0000071B jmp short loc_735
- .text:0000071D ; ------------------------------------------------
- .text:0000071D loc_71D:
- .text:0000071D mov eax, [ebp+var_C]
- .text:00000720 add eax, [ebp+var_18]
- .text:00000723 mov edx, [ebp+var_10]
- .text:00000726 add edx, [ebp+arg_0]
- ; Загрузить в EDX символ из зашифрованной строки
- .text:00000729 movzx edx, byte ptr [edx]
- ; Вычесть из него единицу
- .text:0000072C sub edx, 1
- ; Записать расшифрованный символ обратно
- .text:0000072F mov [eax], dl
- .text:00000731 add [ebp+var_C], 1
- .text:00000735 loc_735:
- .text:00000735 add [ebp+var_10], 1
- .text:00000739 loc_739:
- .text:00000739 mov eax, [ebp+var_10]
- .text:0000073C cmp eax, [ebp+size]
- .text:0000073F jl short loc_6EA
Code (PHP) : Убрать нумерацию
- $str='содержимое зашифрованного скрипта';
- for($i=0; $i<strlen($str); $i++) {
- echo chr(ord($str[$i])-1);
- }
Просмотров: 5806 | Комментариев: 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 (с практической портабельностью, если бы не привязка к железу).
Именно эта версия, т.к. она раздавалась бесплатно. Но при этом ключ зависит от железа, а серверы регистрации уже не работают, так что на новом компе ей уже не воспользуешься. И вот это дело хотелось бы исправить )
На случай если вам захочется более сложного и нативного ) , попробую предложить spacetime https://web.archive.org/web/20....us/windows/ (в дальнейщем переименован в mathstudio и уже без win версии).
Это нечто среднее между калькулятором и маткадом. От первого понятный интерфейс, от второго решение дифуров и т.п. И всего 1Mb (с практической портабельностью, если бы не привязка к железу).
Именно эта версия, т.к. она раздавалась бесплатно. Но при этом ключ зависит от железа, а серверы регистрации уже не работают, так что на новом компе ей уже не воспользуешься. И вот это дело хотелось бы исправить )
goga
(10.03.2014 в 13:46):
Очень интересно)
Добавить комментарий
Заполните форму для добавления комментария