如何反混淆Javascript?

时间:2014-09-06 22:31:04

标签: javascript deobfuscation

我需要帮助去混淆一些Javascript。我一直试图解码它几个小时但我无处可去。

function divulge() {
  eval(function (p, a, c, k, e, r) {
    e = function (c) {
      return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29)  : c.toString(36))
    };
    if (!''.replace(/^/, String)) {
      while (c--) r[e(c)] = k[c] || e(c);
      k = [
        function (e) {
          return r[e]
        }
      ];
      e = function () {
        return '\\w+'
      };
      c = 1
    };
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    return p
  }('19 k=["\\N\\U\\O\\V\\P\\F\\a\\W\\a\\Q\\a\\t\\a\\o\\a\\g\\a\\X\\a\\x\\a\\u\\a\\y\\a\\l\\a\\t\\a\\p\\a\\u\\a\\g\\a\\o\\a\\l\\a\\p\\a\\m\\a\\f\\a\\o\\a\\g\\a\\o\\a\\p\\a\\v\\a\\f\\a\\g\\a\\o\\a\\f\\a\\y\\a\\m\\a\\f\\a\\l\\a\\g\\a\\x\\a\\u\\a\\Y\\a\\f\\a\\m\\a\\g\\a\\o\\a\\p\\a\\v\\a\\f\\a\\g\\a\\n\\a\\m\\a\\Z\\a\\t\\a\\l\\a\\m\\a\\n\\a\\m\\a\\c\\a\\g\\a\\r\\a\\n\\a\\m\\a\\t\\a\\n\\a\\Z\\a\\z\\a\\f\\a\\g\\a\\1a\\a\\Q\\a\\p\\a\\o\\a\\f\\a\\g\\a\\u\\a\\n\\a\\v\\a\\f\\a\\g\\a\\1b\\a\\g\\a\\o\\a\\Q\\a\\n\\a\\z\\a\\z\\a\\g\\a\\u\\a\\p\\a\\l\\a\\g\\a\\m\\a\\f\\a\\r\\a\\f\\a\\n\\a\\z\\a\\1c\\F\\1d\\F\\a\\d\\a\\e\\a\\1e\\a\\d\\a\\h\\a\\G\\a\\d\\a\\h\\a\\G\\a\\d\\a\\h\\a\\H\\a\\d\\a\\i\\a\\10\\a\\d\\a\\s\\a\\A\\a\\d\\a\\s\\a\\A\\a\\d\\a\\h\\a\\i\\a\\d\\a\\e\\a\\w\\a\\d\\a\\e\\a\\h\\a\\d\\a\\e\\a\\B\\a\\d\\a\\e\\a\\w\\a\\d\\a\\e\\a\\B\\a\\d\\a\\s\\a\\B\\a\\d\\a\\e\\a\\i\\a\\d\\a\\e\\a\\11\\a\\d\\a\\e\\a\\12\\a\\d\\a\\h\\a\\i\\a\\d\\a\\e\\a\\i\\a\\d\\a\\h\\a\\i\\a\\d\\a\\e\\a\\i\\a\\d\\a\\s\\a\\B\\a\\d\\a\\e\\a\\A\\a\\d\\a\\h\\a\\s\\a\\d\\a\\e\\a\\h\\a\\d\\a\\s\\a\\A\\a\\d\\a\\h\\a\\i\\a\\d\\a\\e\\a\\C\\a\\d\\a\\e\\a\\i\\a\\d\\a\\h\\a\\s\\a\\d\\a\\e\\a\\C\\a\\d\\a\\h\\a\\G\\a\\d\\a\\h\\a\\i\\F\\R\\S\\1f\\13\\O\\P\\I\\R\\14\\S\\N\\U\\1g\\V\\1h\\13\\O\\P\\D\\R\\14\\S","\\b","\\w\\y\\v\\B\\C","\\b\\b\\c\\d\\h\\b\\c\\e\\f\\b\\c\\d\\I\\b\\c\\e\\i\\b\\c\\f\\h\\b\\c\\e\\e\\b\\c\\i\\e\\b\\c\\i\\d\\b\\c\\f\\D\\b\\c\\e\\d\\b\\c\\f\\12\\b\\c\\f\\11\\b\\c\\i\\g\\b\\c\\f\\m\\b\\c\\f\\H\\b\\c\\g\\f\\b\\c\\g\\h\\b\\1i\\I\\c\\d\\p\\f\\t\\b\\c\\f\\o\\b\\c\\f\\10\\b\\c\\e\\g\\b\\X\\n\\r\\b\\c\\i\\h\\b\\c\\f\\e\\b\\c\\f\\d\\b\\c\\i\\f\\b\\c\\e\\m\\b\\c\\e\\h\\b\\c\\h\\g\\b\\c\\f\\f\\b\\c\\f\\g\\b\\c\\i\\m\\b\\c\\i\\i\\b\\c\\g\\m\\b\\c\\d\\D\\b\\c\\e\\o\\b\\c\\e\\I\\b\\c\\g\\D\\b\\c\\e\\D\\b\\c\\g\\g\\b\\n\\v\\l\\r\\C\\b\\w\\l\\p\\r\\l\\C\\x\\w\\b\\W\\N\\l\\w\\p\\n\\y\\l","","\\t\\r\\x\\G\\H\\A\\n\\r\\H\\x\\u\\l","\\r\\l\\y\\v\\n\\p\\l","\\a\\Y\\1j","\\a\\s","\\z"];1k(J(K,L,j,E,q,T){q=J(j){M(j<L?k[4]:q(1l(j/L)))+((j=j%L)>1m?15[k[5]](j+1n):j.1o(1p))};16(!k[4][k[6]](/^/,15)){17(j--){T[q(j)]=E[j]||q(j)};E=[J(q){M T[q]}];q=J(){M k[7]};j=1};17(j--){16(E[j]){K=K[k[6]](1q 1r(k[8]+q(j)+k[8],k[9]),E[j])}};M K}(k[0],18,18,k[3][k[2]](k[1]),0,{}));', 62, 90, '||||||||||x5C|x7C|x78|x32|x33|x36|x34|x35|x37|_0xd4b0x3|_0x6159|x65|x39|x61|x38|x63|_0xd4b0x5|x72|x62|x66|x64|x6C|x73|x6F|x70|x67|x68|x69|x74|x31|_0xd4b0x4|x22|x6D|x43|x30|function|_0xd4b0x1|_0xd4b0x2|return|x6E|x6A|x5B|x6B|x5D|x3B|_0xd4b0x6|x20|x3D|x75|x76|x77|x71|x44|x45|x46|x28|x29|String|if|while|45|var|x79|x7A|x41|x2C|x42|x47|x48|x49|x5F|x2B|eval|parseInt|35|29|toString|36|new|RegExp'.split('|'), 0, {
  }))
}

我在JSBeautifier中运行它并获得了

function divulge() {
    var _0x6159 = ["\x6E\x20\x6A\x3D\x5B\x22\x5C\x75\x5C\x6B\x5C\x66\x5C\x38\x5C\x34\x5C\x76\x5C\x6F\x5C\x64\x5C\x70\x5C\x65\x5C\x66\x5C\x63\x5C\x64\x5C\x34\x5C\x38\x5C\x65\x5C\x63\x5C\x39\x5C\x36\x5C\x38\x5C\x34\x5C\x38\x5C\x63\x5C\x6C\x5C\x36\x5C\x34\x5C\x38\x5C\x36\x5C\x70\x5C\x39\x5C\x36\x5C\x65\x5C\x34\x5C\x6F\x5C\x64\x5C\x77\x5C\x36\x5C\x39\x5C\x34\x5C\x38\x5C\x63\x5C\x6C\x5C\x36\x5C\x34\x5C\x61\x5C\x39\x5C\x71\x5C\x66\x5C\x65\x5C\x39\x5C\x61\x5C\x39\x5C\x78\x5C\x34\x5C\x72\x5C\x61\x5C\x39\x5C\x66\x5C\x61\x5C\x71\x5C\x67\x5C\x36\x5C\x34\x5C\x79\x5C\x6B\x5C\x63\x5C\x38\x5C\x36\x5C\x34\x5C\x64\x5C\x61\x5C\x6C\x5C\x36\x5C\x34\x5C\x7A\x5C\x34\x5C\x38\x5C\x6B\x5C\x61\x5C\x67\x5C\x67\x5C\x34\x5C\x64\x5C\x63\x5C\x65\x5C\x34\x5C\x39\x5C\x36\x5C\x72\x5C\x36\x5C\x61\x5C\x67\x5C\x41\x22\x2C\x22\x5C\x32\x5C\x33\x5C\x42\x5C\x32\x5C\x35\x5C\x6D\x5C\x32\x5C\x35\x5C\x6D\x5C\x32\x5C\x35\x5C\x43\x5C\x32\x5C\x37\x5C\x44\x5C\x32\x5C\x62\x5C\x68\x5C\x32\x5C\x62\x5C\x68\x5C\x32\x5C\x35\x5C\x37\x5C\x32\x5C\x33\x5C\x73\x5C\x32\x5C\x33\x5C\x35\x5C\x32\x5C\x33\x5C\x69\x5C\x32\x5C\x33\x5C\x73\x5C\x32\x5C\x33\x5C\x69\x5C\x32\x5C\x62\x5C\x69\x5C\x32\x5C\x33\x5C\x37\x5C\x32\x5C\x33\x5C\x45\x5C\x32\x5C\x33\x5C\x46\x5C\x32\x5C\x35\x5C\x37\x5C\x32\x5C\x33\x5C\x37\x5C\x32\x5C\x35\x5C\x37\x5C\x32\x5C\x33\x5C\x37\x5C\x32\x5C\x62\x5C\x69\x5C\x32\x5C\x33\x5C\x68\x5C\x32\x5C\x35\x5C\x62\x5C\x32\x5C\x33\x5C\x35\x5C\x32\x5C\x62\x5C\x68\x5C\x32\x5C\x35\x5C\x37\x5C\x32\x5C\x33\x5C\x74\x5C\x32\x5C\x33\x5C\x37\x5C\x32\x5C\x35\x5C\x62\x5C\x32\x5C\x33\x5C\x74\x5C\x32\x5C\x35\x5C\x6D\x5C\x32\x5C\x35\x5C\x37\x22\x5D\x3B\x47\x28\x6A\x5B\x30\x5D\x29\x3B\x6E\x20\x48\x3D\x49\x28\x6A\x5B\x31\x5D\x29\x3B", "\x7C", "\x73\x70\x6C\x69\x74", "\x7C\x7C\x78\x32\x35\x7C\x78\x33\x36\x7C\x78\x32\x30\x7C\x78\x33\x37\x7C\x78\x36\x35\x7C\x78\x33\x33\x7C\x78\x37\x33\x7C\x78\x37\x32\x7C\x78\x36\x31\x7C\x78\x33\x32\x7C\x78\x36\x46\x7C\x78\x36\x45\x7C\x78\x37\x34\x7C\x78\x36\x39\x7C\x78\x36\x43\x7C\x78\x34\x36\x7C\x78\x34\x35\x7C\x5F\x30\x78\x32\x63\x36\x66\x7C\x78\x36\x38\x7C\x78\x36\x44\x7C\x78\x33\x34\x7C\x76\x61\x72\x7C\x78\x37\x35\x7C\x78\x36\x33\x7C\x78\x36\x32\x7C\x78\x37\x36\x7C\x78\x33\x39\x7C\x78\x33\x35\x7C\x78\x35\x34\x7C\x78\x36\x36\x7C\x78\x36\x34\x7C\x78\x37\x39\x7C\x78\x37\x37\x7C\x78\x34\x39\x7C\x78\x32\x31\x7C\x78\x33\x38\x7C\x78\x33\x30\x7C\x78\x34\x31\x7C\x78\x33\x31\x7C\x78\x34\x34\x7C\x61\x6C\x65\x72\x74\x7C\x73\x65\x63\x72\x65\x74\x6F\x73\x7C\x75\x6E\x65\x73\x63\x61\x70\x65", "", "\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65", "\x72\x65\x70\x6C\x61\x63\x65", "\x5C\x77\x2B", "\x5C\x62", "\x67"];
    eval(function (_0xd4b0x1, _0xd4b0x2, _0xd4b0x3, _0xd4b0x4, _0xd4b0x5, _0xd4b0x6) {
        _0xd4b0x5 = function (_0xd4b0x3) {
            return (_0xd4b0x3 < _0xd4b0x2 ? _0x6159[4] : _0xd4b0x5(parseInt(_0xd4b0x3 / _0xd4b0x2))) + ((_0xd4b0x3 = _0xd4b0x3 % _0xd4b0x2) > 35 ? String[_0x6159[5]](_0xd4b0x3 + 29) : _0xd4b0x3.toString(36))
        };
        if (!_0x6159[4][_0x6159[6]](/^/, String)) {
            while (_0xd4b0x3--) {
                _0xd4b0x6[_0xd4b0x5(_0xd4b0x3)] = _0xd4b0x4[_0xd4b0x3] || _0xd4b0x5(_0xd4b0x3)
            };
            _0xd4b0x4 = [
                function (_0xd4b0x5) {
                    return _0xd4b0x6[_0xd4b0x5]
                }];
            _0xd4b0x5 = function () {
                return _0x6159[7]
            };
            _0xd4b0x3 = 1
        };
        while (_0xd4b0x3--) {
            if (_0xd4b0x4[_0xd4b0x3]) {
                _0xd4b0x1 = _0xd4b0x1[_0x6159[6]](new RegExp(_0x6159[8] + _0xd4b0x5(_0xd4b0x3) + _0x6159[8], _0x6159[9]), _0xd4b0x4[_0xd4b0x3])
            }
        };
        return _0xd4b0x1
    }(_0x6159[0], 45, 45, _0x6159[3][_0x6159[2]](_0x6159[1]), 0, {}));
}

此时我很丢失。第一个代码是不是混淆了吗?我在编程方面没有太多经验,这是我一直试图做的计算机科学挑战的一部分。我也尝试用警报替换第1行的功能,它说有一个丢失的分号,但我不确定在哪里。

1 个答案:

答案 0 :(得分:2)

这是一个关于反混淆它的快速教程。我不会详细介绍,因为这是一个挑战应该解决这个问题。

获取原始代码并查看其结构。它基本上是

的形式
function divulge() {
    eval(function(...) { 
        /* nobody cares what happens here */

        // now this is interesting, because p will contain the string that eval() will execute!
        return p; 
    }(...));
}

现在应该很明显,如何学习这个代码将执行什么而不是让它实际执行:p将获得eval,所以只需拦截它。这将显示它只是更多的代码(显然)。

让我们重新开始吧!看一下新代码,在美化之后,我们会看到结构基本相同。所以有人试图通过多次混淆代码来偷偷摸摸。太糟糕了,我们已经对它进行了一次反混淆,所以我们只重复整个过程。

第二次之后,我们得到结构的代码

var _0x2c6f = ["..."];
alert(_0x2c6f[0]);
var secretos = unescape(_0x2c6f[1]);

这将提醒以下文字:

This function stores some secret under some arbitrary variable whose name I shall not reveal! 

最后,secretos包含一个链接。但是,我会在这里审查链接有多种原因:

http://signin.**********.org/secrets