尝试对多层 javascript 进行反混淆

逆向工程 混淆 javascript 去混淆
2021-07-09 04:34:16

根据技术zilla 博客

对使用多种混淆算法混淆的代码进行反混淆会困难得多。据他们说,jsbeautifier 无法修复这个混淆的代码。你能找到另一种方法来对这种类型的混淆进行反混淆吗?如果没有,你能得到的最接近的是什么?

var _0x2815=["\x33\x20\x31\x28\x29\x7B\x32\x20\x30\x3D\x35\x3B\x34\x20\x30\x7D","\x7C","\x73\x70\x6C\x69\x74","\x78\x7C\x6D\x79\x46\x75\x6E\x63\x74\x69\x6F\x6E\x7C\x76\x61\x72\x7C\x66\x75\x6E\x63\x74\x69\x6F\x6E\x7C\x72\x65\x74\x75\x72\x6E\x7C","\x72\x65\x70\x6C\x61\x63\x65","","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function (_0xf81fx1,_0xf81fx2,_0xf81fx3,_0xf81fx4,_0xf81fx5,_0xf81fx6){_0xf81fx5=function (_0xf81fx3){return _0xf81fx3;} ;if(!_0x2815[5][_0x2815[4]](/^/,String)){while(_0xf81fx3--){_0xf81fx6[_0xf81fx3]=_0xf81fx4[_0xf81fx3]||_0xf81fx3;} ;_0xf81fx4=[function (_0xf81fx5){return _0xf81fx6[_0xf81fx5];} ];_0xf81fx5=function (){return _0x2815[6];} ;_0xf81fx3=1;} ;while(_0xf81fx3--){if(_0xf81fx4[_0xf81fx3]){_0xf81fx1=_0xf81fx1[_0x2815[4]]( new RegExp(_0x2815[7]+_0xf81fx5(_0xf81fx3)+_0x2815[7],_0x2815[8]),_0xf81fx4[_0xf81fx3]);} ;} ;return _0xf81fx1;} (_0x2815[0],6,6,_0x2815[3][_0x2815[2]](_0x2815[1]),0,{}));
4个回答

使用Malzilla,我能够在大约 30 秒内消除混淆。

第 1 步,打开 Malzilla,选择解码器选项卡,然后粘贴 JavaScript。

在此处输入图片说明

第 2 步,您可以选择按“格式化代码”按钮来对 JS 进行基本的重新格式化。

第 3 步,选中Override eval(),然后单击Run script按钮。

在此处输入图片说明

您会注意到在输出框中,打印了去混淆的代码:

function myFunction(){var x=5;return x}

为什么要限制自己进行静态反混淆?如果您通过 JavaScript 调试器运行该脚本并在return语句上中断,您可以看到_0xf81fx1= function myFunction(){var x=5;return x},这是混淆之前函数的纯文本。

此外,如果您通过http://jsbeautifier.org运行它,输出的最后一行是:

}('3 1(){2 0=5;4 0}', 6, 6, 'x|myFunction|var|function|return|' ['split']('|'), 0, {}));

可以看出,'3 1(){2 0=5;4 0}'字符串只保存了 string-array 中字符串的 indeces 'x|myFunction|var|function|return|'因此,无论如何,http://jsbeautifier.org几乎一直对其进行反混淆处理。

实际上,jsbeautifier.org 并不是 JS 去混淆的来源。有关更多详细信息,请参阅此问题分析高度混淆的 JavaScript

经过多次去混淆,后面的代码似乎是:

//eval function myFunction(){var x=5;return x}

http://jsunpack.jeek.org/?report=24921f4d96d1e05abfc0affd2233bd69874056c9

您可以尝试使用de4js对于原始帖子中的 javascript 片段,de4js 生成以下输出:

var _0x2815 = ["3 1(){2 0=5;4 0}", "|", "split", "x|myFunction|var|function|return|", "replace", "", "\\w+", "\\b", "g"];
eval(function (_0xf81fx1, _0xf81fx2, _0xf81fx3, _0xf81fx4, _0xf81fx5, _0xf81fx6) {
    _0xf81fx5 = function (_0xf81fx3) {
        return _0xf81fx3;
    };
    if (!_0x2815[5][_0x2815[4]](/^/, String)) {
        while (_0xf81fx3--) {
            _0xf81fx6[_0xf81fx3] = _0xf81fx4[_0xf81fx3] || _0xf81fx3;
        };
        _0xf81fx4 = [function (_0xf81fx5) {
            return _0xf81fx6[_0xf81fx5];
        }];
        _0xf81fx5 = function () {
            return _0x2815[6];
        };
        _0xf81fx3 = 1;
    };
    while (_0xf81fx3--) {
        if (_0xf81fx4[_0xf81fx3]) {
            _0xf81fx1 = _0xf81fx1[_0x2815[4]](new RegExp(_0x2815[7] + _0xf81fx5(_0xf81fx3) + _0x2815[7], _0x2815[8]), _0xf81fx4[_0xf81fx3]);
        };
    };
    return _0xf81fx1;
}(_0x2815[0], 6, 6, _0x2815[3][_0x2815[2]](_0x2815[1]), 0, {}));

eval被选择的单选按钮,这减少至

function myFunction() {
    var x = 5;
    return x
}