http://www.manhunter.ru/webmaster/22_zaschita_php_skriptov_ot_analiza_i_modifikacii.html
Распаковка и расшифровка скриптов JavaScript
| Автор: ManHunter
Эта статья
- дополнение к
статье про
деобфускацию скриптов. Здесь будут рассмотрены основные принципы шифровки и
упаковки, слабые места защит, способы ручного снятия, а также универсальные
инструменты для автоматического снятия упаковщиков и навесной защиты со скриптов
JavaScript. В последнее время все чаще исходный код скриптов шифруется или
пакуется. Этим начали увлекаться Яндекс, DLE и другие популярные проекты, а
красивые байки про "заботу о пользователях", "экономию трафика" и прочую чушь
выглядят очень смешно. Что ж, если кому-то есть что скрывать, значит наша задача
вывести их на чистую воду.
Начнем с теории. Из-за особенностей выполнения
JavaScript все шифровщики и упаковщики, несмотря на их разнообразие, имеют всего
два варианта алгоритма:
- var encrypted='зашифрованные данные';
- function decrypt(str) {
- // функция расшифровки или распаковки
- }
- // Выполнить расшифрованный скрипт
- eval(decrypt(encrypted));
или как вариант:
- var encrypted='зашифрованные данные';
- function decrypt(str) {
- // функция расшифровки или распаковки
- }
- // Вывести на экран расшифрованные данные
- document.write(decrypt(encrypted));
Второй способ чаще всего используется для защиты
исходного html-кода страницы, а также разными троянами для внедрения в страницу
вредоносного кода, например скрытого фрейма. Оба алгоритма могут
комбинироваться, "навороченность" и запутанность расшифровщика может быть любой,
неизменным остается только сам принцип.
В обеих случаях
получается, что функциям
eval() и
document.write() передаются
полностью расшифрованные данные. Как их перехватить? Попробуйте заменить
eval() на
alert(), и в открывшемся MessageBox'е вы сразу увидите
расшифрованный текст. Некоторые браузеры позволяют копировать текст из
MessageBox'ов, но лучше воспользоваться таким вот полуавтоматическим декодером:
- <html>
- <head><title>JavaScript Decoder</title></head>
- <body>
-
- <script type="text/javascript">
- // Функция записи в лог результатов расшифровки
- function decoder(str) {
- document.getElementById('decoded').value+=str+'\n';
- }
- </script>
-
- <!-- Окно лога -->
- <textarea id="decoded" style="width:900px; height:500px;"></textarea>
-
- <script type="text/javascript">
- // Сюда вставить зашифрованный скрипт, предварительно
- // заменить в нем все вызовы eval() и document.write() на decoder().
- </script>
-
- </body>
- </html>
Для примера
возьмем
какой-нибудь скрипт с Яндекса, посмотрев исходный код видим что-то
нездоровое:
eval(function(p,a,c,k,e,r){e=function©{return(c<a?'':e(parseInt(
c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!
''.replace(/^/,String)){while(c--)r[e©]=k[c]||e©;k=[function(e
){return
r[e]}];e=function(){return'\w+'};c=1};while(c--)if(k[c])
p=p.replace(new
RegExp('\b'+e©+'\b','g'),k[c]);return p}('$.1e
.18=8(j){3
k=j["6-9"]||"#6-9";3 l=j["6-L"]||".u-L";3 m=j["6-L-17"]
||"";3
n=j["1d"]||0;$(5).2(".6-9").14("7");$(5).2(".6-9").Z("7",8(
){3 a=$(5).x();3
o=$(5).x();3 h=$(5).B("C");$(5).v("g-4");$(5).16(
$(k).q());3
t=$(o).2("15");3 c=$(o).2(".b-r");3 d=$(o).2(".b-12");
[остальной такой же
бред отрезан]
Сразу скажу, что этот скрипт обработан
JavaScript
Compressor, его легко узнать по сигнатуре - характерному названию фукнции в
начале скрипта. Копируем целиком исходный текст скрипта, заменяем первый
eval на
decoder, вставляем в декодер и сохраняем его как
html-страничку.
- <script type="text/javascript">
- // Сюда вставить зашифрованный скрипт, предварительно
- // заменить в нем все вызовы eval() и document.write() на decoder().
- decoder(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e...
- </script>
Открываем ее в любом браузере и видим, что в
textarea сразу появился распакованный скрипт. Радоватся пока рано, в нем убраны
все переносы строчек и форматирование кода. Как с этим бороться написано в
статье про
деобфускацию.
Второй пример. Вот
html-страничка,
накрытая программой HTML Protector. Это страница, демонстрирующая возможности
программы, поэтому там задействованы все опции: блокировка выделения и
копирования текста, запрет правой кнопки мыши, защита картинок, скрытие строки
состояния, шифрование html-кода и т.д. Открываем исходный код, смотрим. В самом
верху уже знакомый нам document.write и зашифрованный скрипт. Запускаем его
через декодер, получаем функцию расшифровки основного содержимого:
- hp_ok=true;function hp_d01(s){ ...вырезано... o=ar.join("")+os;document.write(o)
Заменяем в функции
последний document.write на decoder и вставляем после нее все три оставшихся
зашифрованных скрипта:
- <script type="text/javascript">
- // Сюда вставить зашифрованный скрипт, предварительно
- // заменить в нем все вызовы eval() и document.write() на decoder().
- hp_ok=true;function hp_d01(s){ .... o=ar.join("")+os;decoder(o);
- hp_d01(unescape(">QAPKRV%22NCLEWC ....
- hp_d01(unescape(">QAPKRV%22NCLEWCEG? HctcQa ...
- hp_d01(unescape(">`mf{%22`eamnmp? !DDDDDD %22v ...
- </script>
Для
удобства в статье скрипты приводятся не полностью, вы же должны копировать их
целиком. Открываем декодер в браузере и видим защитные скрипты, добавленные
программой, и расшифрованный исходный текст страницы. Для удобства можно
расшифровывать только третий скрипт, в котором содержится html-код страницы. Вот
и вся защита. Как видите, ничего сложного. Аналогично снимаются и другие защиты
html-страниц.
От ручной расшифровки перейдем к автоматической. Для снятия
защит первого типа я немного модифицировал уже известный вам скрипт
Beautify
Javascript и откомпилировал его в exe-файл. Он без проблем справляется с
большинством виденных мной защит и упаковщиков JavaScript.
Для более сложных случаев придется пускать в ход тяжелую
артиллерию. Это бесплатный проект
Malzilla, предназначенный для
исследования троянов и другого вредоносного кода. Поскольку все программы,
предназначенные для защиты авторского права, являются однозначно вредоносными,
Malzilla поможет нам в борьбе с ними. Качаем
последнюю
версию (на сегодняшний день это 1.2.0), распаковываем, запускаем. Открываем
вторую вкладку Decoder, в верхнее окно вставляем код зашифрованного скрипта,
нажимаем кнопочку
Run script.
Malzilla за работой В папке
eval_temp складываются все результаты выполнения функций eval(), в том
числе и промежуточные. Их можно посмотреть, нажав на кнопку
Show eval()
results, текст откроется в нижнем окне. Его можно скопировать, вставить в
верхнее окно и сразу же отформатировать нажатием кнопки
Format code.
Кроме декодера Malzilla имеет еще множество инструментов и настроек, позволяющих
легко снять любую защиту со скриптов JavaScript.
Скрипт успешно
расшифрован и отформатирован Также можно обратить внимание на еще
один бесплатный инструмент для работы с зашифрованными скриптами -
FreShow. Функций в нем поменьше, но вполне имеет место быть. С офсайта
можно
скачать демонстрационный ролик,
показывающий пример работы с программой.
Как видите, нет ничего сложного
в снятии защиты со скриптов JavaScript и с html-страниц. Вы все еще продолжаете
защищать свои поганые "аффтарские права"? Тогда мы идем к вам!
http://www.manhunter.ru/underground/32_raspakovka_i_rasshifrovka_skriptov_javascript.html
PCL's PHPiD 1.0 Public Release
| Автор: ManHunter
Скриншот программы PCL's
PHPiD PCL's PHPiD - программа для определения чем зашифрован
или обработан PHP-скрипт, всего определяет более 40 различных протекторов и
обфускаторов.
PCL's PHPiD представляет собой один из модулей закрытого
проекта Massacre, снабженный графической оболочкой (файл
phpid.exe), а
также консольный вариант программы (файл
phpid_ce.exe). Поиск, в
основном, выполняется по сигнатурам, так что теоретически возможны неточности в
идентификации, но мне пока такие скрипты не попадались. Также некоторые
обфускаторы используют сходные алгоритмы (например, PHP LockIt! и PHP Defender)
и на выходе дают практически одинаковый результат. В этом случае точно
определить, чем обработан скрипт, не получится и будет выбран наиболее похожий
вариант. Размер анализируемого скрипта должен быть не более 1 мегабайта. Скрипты
также можно передавать через командную строку и drag'n'drop.
Определяемые
протекторы:
- TrueBug PHP Encoder 1.0.2 (incl. GZIP), 1.0.3/1.0.4
- NuSphere NuCoder
- Zend Encoder / Zend SafeGuard Suite
- ByteRun Protector for PHP
- SourceCop (incl. protection module)
- CodeLock (incl. protection module)
- SourceGuardian for PHP
- PHPCipher
- phpSHIELD
- CNCrypto
- PHTML Encoder
- ionCube PHP Encoder
- PHP LockIt! 1.8, 2.0 (incl. GZIP)
- Obfusc (Basic/Normal, ShowObfuscate)
- Zorex PHP CryptZ (incl. protection module)
- gencoder
- DWebEncoder
- Free PHP Encoder
- PHP Compact
- TrueBug PHP Obfuscator 1.1
- PHPCoder / eAccelerator
- FREE Encrypted PHP
- Free Online PHP Obfuscator
- BCompiler
- IcePHP
- ZenCrypt
- AROHA PHPencoder
- PHP Locker
- Easy PHP Encrypt
- CodeTangler Pro
- HidePHP
- Turck MMCache Encoder
- Rucros PHP Obfuscator
- Encode PHP
- G-Encoder
- NET-TEC PHP-ENCODER
Определяемые обфускаторы:
- Semantic Designs Obfuscator
- PHP Defender
- PHP LockIt! (Obfuscation mode)
- Raizlabs PHP Obfuscator
- POBS - PHP Obfuscator
- Processed by De-Zender
- PHP Obfuscator by DX
Подробнее про каждый протектор из этого списка
вы можете почитать в моей
статье про защиту скриптов. Если у вас есть еще какая-нибудь дрянь, которой нет в
списке или которая не определилась PCL's PHPiD, то присылайте мне ссылки на нее
и/или образцы защищенных скриптов через
форму обратной
связи. Буду очень благодарен.
Коды возврата консольной
версии программы (ERRORLEVEL):
0 = нет ошибок
1 = не заданы параметры
командной строки
2 = файл не найден или произошла системная ошибка
3 =
файл слишком большой (более 1 мегабайта)
Пример использования в файле
phpid_ce.bat. Вывод из консольной версии идет на stdout, так что его
можно перенаправлять как угодно, например, записывать в файл или передавать для
обработки другой программе.
http://www.manhunter.ru/releases/90_pcls_phpid_1_0_public_release.html