JavaScript 代码混淆实战(三):Bool常量值的混淆 Web逆向 原创


一. 随处可见的![] 与 !![]


在被混淆了的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相关的知识。




最新回复 (0)
返回