0x00 目标
基于AST实现针对使用控制流平展混淆的JS代码的反混淆。
0x01 反混淆方案
为了直观地说明JS的混淆方案,先上JS代码(某大厂真实代码):
function Qs() {
for (var s = 1; void 0 !== s; ) {
var r = 3 & s
, c = s >> 2
, b = 3 & c;
switch (r) {
case 0:
!function() {
switch (b) {
case 0:
k += "do",
s = 8;
break;
case 1:
k += "Nt",
s = 2;
break;
case 2:
s = k ? 4 : 2;
break;
case 3:
s = void 0
}
}();
break;
case 1:
var k = "e";
s = k ? 0 : 8;
break;
case 2:
k += "nerap",
k = k.split("").reverse().join("");
var i = kr[k];
s = i ? 3 : 12;
break;
case 3:
a.push(175528201),
a.push(24898129191),
a.push(2),
a.push(0),
e(13, 2, -1);
var o = a.pop();
i[o](kr),
s = 12
}
}
}
不难看出,这段代码以switch-case的方式实现使用了控制流平展混淆。相比于常规的控制流平展混淆的改进之处在于,它的switch-case结构不止一层,本例中嵌套了一层。理论上可以多层嵌套。
反混淆方案
控制流平展混淆的反混淆方案比较常规了,网上的文章也比较多。简单来说