JSの牛暗号化された砲撃難読化ツールを解読するためにブレーク。

数日フォーラムを訪問する前に、誰かが暗号化されたJSコードを解読する方法を探して。

暗号化は始まりがあり、典型的なものです ;var encode_version = 'sojson.v5'

私たちは何度も前に見て、彼らは利益のために、この、増加を見ることからも、このことについて心配されていません。

だから、私はそれを復号化する方法を見てすることを決めました。

そして、私はJS前側、最も混乱は実際の暗号化、あり得ないことができると思います。

暗号化と混乱は、オープンソースのインターネットの精神に沿って、私は何をあなたの隠された宝物のコードを見てみたいと思いません。

苦渋の午後の後、最終的に私は、このスクリプトはまだ出て取得します。

混乱させるために、復号化を砲撃が、変数名と同様に怒られたことのみコードを読み取るために自分自身を復元するために、戻ることはほとんどありません実現。

著者は、右と言う絶対的に不可逆的なすべての後に、失われた情報の多くを始める、本当です。

そして、ほとんどの牛の暗号化を行っている間、私が思うに、有料暗号化に取り組みながら、解読は非常に一番下の行ものではありません。

Snipaste_2019-08-30_22-24-18.png

(function (js_body) {
    // 脱壳 && 解密
    let js_arr = js_body.split("\n").pop().split(';'),
        fun_name = /var\s+(_0x[a-z0-9]+)=/.exec(js_arr[6])[1],
        reg_str = fun_name + '\\(' + "'([^']+)',\s*'([^']+)'" + '\\)',
        js_str = js_arr.slice(54, js_arr.length - 4).join(';'),
        code_shell = js_arr.slice(0, 54).join(';'),
        shell_obj = eval("(function(){" + code_shell + ";return " + fun_name + "})()");
    js_str = js_str.replace(new RegExp(reg_str, 'g'), function (str, id, key) {
        return '"' + shell_obj(id, key) + '"';
    }).replace(/([a-z0-9\-_A-Z)\]]+)\s?\[["']([^"']+)["']\]/g, '$1.$2').replace(/(?<!_)(0x[0-9a-f]+)/g, function (hex) {
        return parseInt(hex).toString();
    });
    // 还原混淆
    let obj = null, name = '';
    js_str = js_str.replace(/{(var\s+(_0x[0-9a-z]+)=(\{(.*)\}));/g, function (str, code_str, _name, obj_str) {
        obj = eval("(function () {return " + obj_str + "})()");
        name = _name;
        return '{';
    });
    if (obj) {
        let i = 5;
        while (js_str.indexOf(name) && --i > 0) {
            for (const key in obj) {
                if (!obj.hasOwnProperty(key)) continue;
                if (typeof obj[key] == 'function') {
                    let fun_info = /function\s*_0x[0-9a-z]+\(([^)]*)\){return\s*([^;]+);}/.exec(obj[key].toString());
                    js_str = js_str.replace(new RegExp(name + '\\.' + key + '\\(([^())]*)\\)', 'g'), function (string, args_str) {
                        let args = args_str.split(','),
                            fun_args = fun_info[1].split(','),
                            fun_body = fun_info[2];
                        fun_args.forEach(function (item, index) {
                            fun_body = fun_body.replace(item, args[index]);
                        });
                        return fun_body;
                    });
                } else if (typeof obj[key] == 'string') {
                    js_str = js_str.replace(name + '.' + key, '"' + obj[key] + '"');
                } else {
                    js_str = js_str.replace(name + '.' + key, obj[key].toString());
                }
            }
        }
    }
    return js_str;
})($('#resultSource').val() || $('#jsdata').val());

 

公開された69元の記事 ウォン称賛31 ビュー80000 +

おすすめ

転載: blog.csdn.net/yyws2039725/article/details/103713185