一. 随处可见的![] 与 !![]
在被混淆了的JavaScript代码中,几乎随处可见这种类型的表达式:
let a = ![];
............
while (!![])
{
//some codes
}
对于初学者来说,这样的表达式令人头疼,其实很简单,只要在控制台分别输出就能得到结果值:

运行后再看,就再简单不过了:
![] == false
!![] == true
二. 插件编写
插件的功能很简单:
处理前:
var a = false,b = true;
处理后:
var a = ![],b = !![];
也就是将 false 变成 ![],true 变成 !![] .
在线解析网站可以得知前后节点类型不同,false/true为 BooleanLiteral 类型的节点,而 ![] / !![] 则为 UnaryExpression 类型的节点。
因此只需遍历 BooleanLiteral 节点和构造UnaryExpression节点,再进行替换即可。

如上图所示,构造 UnaryExpression节点也是非常的简单。在这里不做深入讲解。
插件源代码如下:
const types = require("@babel/types");
const boolToUnary = {
BooleanLiteral(path)
{
let node = types.UnaryExpression("!",types.ArrayExpression(),true);
if (path.node.value)
{
node = types.UnaryExpression("!",node,true);
}
path.replaceWith(node);
},
}
代码很简单,不足15行,相信有AST相关基础的都能看懂。
在写了很多AST混淆JavaScript插件后,感觉非常的爽。
欢迎关注本人微信公众号,学习交流更多AST相关的知识。
