Как дешифровать eval(base64_decode()); eval(gzinflate(base64_decode()));
Основные принципы шифровки и упаковки, слабые места защит, способы ручного снятия, а также универсальные инструменты для автоматического снятия упаковщиков и навесной защиты со скриптов 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(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!
''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e
){return r[e]}];e=function(){return'\w+'};c=1};while(c--)if(k[c])
p=p.replace(new RegExp('\b'+e(c)+'\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-страниц.
Софт для исследования троянов и другого вредоносного кода
Для более сложных случаев придется пускать в ход тяжелую артиллерию. Это бесплатный проект Malzilla, предназначенный для исследования троянов и другого вредоносного кода. Поскольку все программы, предназначенные для защиты авторского права, являются однозначно вредоносными, Malzilla поможет нам в борьбе с ними. Качаем последнюю версию, распаковываем, запускаем. Открываем вторую вкладку Decoder, в верхнее окно вставляем код зашифрованного скрипта, нажимаем кнопочку Run script.
Malzilla за работой
В папке eval_temp складываются все результаты выполнения функций eval(), в том числе и промежуточные. Их можно посмотреть, нажав на кнопку Show eval() results, текст откроется в нижнем окне. Его можно скопировать, вставить в верхнее окно и сразу же отформатировать нажатием кнопки Format code. Кроме декодера Malzilla имеет еще множество инструментов и настроек, позволяющих легко снять любую защиту со скриптов JavaScript.
Скрипт успешно расшифрован и отформатирован
Также можно обратить внимание на еще один бесплатный инструмент для работы с зашифрованными скриптами - FreShow.
Декодинг <?php eval(gzinflate(base64_decode(‘encoded text‘))); ?> - вариант 1 (скрипт)
Столкнулся вот только что с задачей как бы потихому вскрыть закодированный через <?php eval(gzinflate(base64_decode(‘encoded text‘))); ?> php код.
Как всегда за подсказкой решил обратиться к Гуглю. Ответ как всегда нашелся нашелся.
Код:
<html> <body> <!– начало дешифровки –> <?php $str = gzinflate(base64_decode(‘encoded text’)); while(1) { if(($pos1 = strpos($str, ‘eval(’)) === FALSE) { break; } $pos2 = strpos($str, ‘);’); $newstr = substr($str,$pos1+5,$pos2-$pos1-5); eval(‘$str =’.$newstr.";"); } print $str; ?> <!– конец дешифровки –> </body> </html>
Сохраняете этот файл как вам угодно, заливате на хост, или запускаете у себя на локалхосте и копируете из исходника все, что находится между тегами
<!– начало дешифровки –>
...
<!– конец дешифровки –>
Все. Код дешифрован.
Декодинг <?php eval(gzinflate(base64_decode(‘encoded text‘))); ?> - вариант 2 (скрипт)
В данном случае необходимо сделать следующее:
- сохранить этот файл как decrypt.php
- Зашифрованный код сохранить как coded.txt
- создать пустой файл decoded.txt (если будете запускать файл на сервере, то укажите ему CHMOD 0666)
- запустите файл decrypt.php
- в файле decoded.txt теперь должен лежать расшифрованный PHP код.
Код:
<?php /* Taken from http://www.php.net/manual/de/function.eval.php#59862 Directions: 1. Save this snippet as decrypt.php 2. Save encoded PHP code in coded.txt 3. Create a blank file called decoded.txt (from shell do CHMOD 0666 decoded.txt) 4. Execute this script (visit decrypt.php in a web browser or do php decrypt.php in the shell) 5. Open decoded.txt, the PHP should be decrypted if not comment below http://danilo.ariadoss.com/decoding-eval-gzinflate-base64-decode/ */ echo "\nDECODE nested eval(gzinflate()) by DEBO Jurgen <jurgen@person.be>\n\n"; echo "1. Reading coded.txt\n"; $fp1 = fopen ("coded.txt", "r"); $contents = fread ($fp1, filesize ("coded.txt")); fclose($fp1); echo "2. Decoding\n"; while (preg_match("/eval\(gzinflate/",$contents)) { $contents=preg_replace("/< \?|\?>/", "", $contents); eval(preg_replace("/eval/", "\$contents=", $contents)); } echo "3. Writing decoded.txt\n"; $fp2 = fopen("decoded.txt","w"); fwrite($fp2, trim($contents)); fclose($fp2); ?>
Upon decrypting the source code I realized that the freeware application downloaded spyware onto visitors’ computers as well as periodically initiated pop-ups that contained obvious spam. I posted this article in order for others to be able to examine the actual source of these applications in order to prevent them from inadvertently running malicious code on their websites. I hope this helped some of you and I will endeavor to continue to post useful and insightful entries from now on.
Декодинг <?php eval(gzinflate(base64_decode(‘encoded text‘))); ?> - вариант 3 (онлайн)
Как расшифровать код и убрать коммерческие ссылки из платных и бесплатных скриптов?
Случай первый:
eval(base64_decode(‘SGksIG1hbg==’));
Если встречаемстроку eval(base64_decode(‘SGksIG1hbg==’)),
то заходим по
Случай второй:
eval(gzinflate(base64_decode(’80jNyclXyFTPVUhJTc5PSU0BAA==’)));
Если встречаем строку eval(gzinflate(base64_decode(’80jNyclXyFTPVUhJTc5PSU0BAA==’)));,
заходим уже по
<?php eval((base64_decode(‘encoded text‘)); - вариант 4 (с помощью echo)
Для расшифровки вредоносных вкраплений в php код типа:
eval(base64_decode(”DQplcnJvcl9yZXBv...tPWhlYWRlc...2F0aW9uOiBodHRwOi8...eGl0KCk7DQp9Cn0KfQ0KfQ0KfQ==”));
Можно элементарно заменить функцию eval на функцию echo и посмотреть чего получилось.
Это один из самых элементарных способов дешифровать base64_decode...
Если ни один из способов не помог, значит не судьба :(
Если Вам встречались ещё какие — нибудь варианты решения данной проблемы, пишите в комментария, попытаемся с ними разобраться.
Дата створення/оновлення: 06.09.2019