AST反混淆实战|为什么反混淆工具越来越无力了?

关注它,不迷路。       

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

1.提出问题

下面的这段混淆代码由星友提供:

var u = r(-492, 0, 0, -459), a = function (e) {
    if (!e) {
        if (function (e, r, n, s, i) {
            return t(n - 85, i);
        }(0, 0, 115, 0, 95) !== function (e, r, n, s, i) {
            return t(n - -67, i);
        }(0, 0, -51, 0, -46)) return "";
        _0x4d4a14.setStorageSync(function (e, r, n, s, i) {
            return t(n - -32, r);
        }(0, -38, -3), _0x443dfa.responseBody), _0x5bd3f1(_0x3b3565.responseBody);
    }
}

请问一下这段js是什么混淆方式? ob解混淆一键还原没解出来。

2.解答问题

首先呢,我们先要搞清楚 自动解混淆 的原理。

1.它通过脚本自动抠取解密函数的定义,以及与其相关的代码,通过 eval 的形式,使之在AST脚本中进行定义。

这样在这个AST脚本中也能调用这个(些)函数。

2.eval函数及相关在本地后,通过遍历它的所有函数调用,计算出正确的结果,再进行节点替换。

3.第二步在遍历的时候,需要指定函数名,并且其实参均需要是字面量,才好进行计算。

在上述的 混淆样本中,我们看到有一些自执行函数,比如:

function (e, r, n, s, i) {
      return t(n - 85, i);
    }(0, 0, 115, 0, 95)

虽然可以得到具体的函数名t,但是它的实参却是无法确定的。

因此,你需要将上述代码进行处理一下,将函数的实参给替换进去,变成:

function () {
        return t(115 - 85, 95);
}()

这种特定的自执行函数,可以将return语句给提取出来,变成:

t(115 - 85, 95);

还原到这个程度,自动解混淆脚本就好处理了。经过这两步处理后的效果是这样的:

var u = r(-492, 0, 0, -459),
  a = function (e) {
    if (!e) {
      if (t(115 - 85, 95) !== t(-51 - -67, -46)) return "";
      _0x4d4a14.setStorageSync(t(-3 - -32, -38), _0x443dfa.responseBody), _0x5bd3f1(_0x3b3565.responseBody);
    }
  };

完整代码请看星球:

https://t.zsxq.com/1508yaLuz

AST反混淆的插件执行有着严格的先后顺序,否则还原效果则不尽人意。

今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

AST反混淆实战|为什么反混淆工具越来越无力了?_第1张图片

欢迎加入知识星球,学习更多AST和爬虫技巧。

你可能感兴趣的:(javascript,开发语言,ecmascript,前端)