回答

收藏

JavaScript 代码混淆实战(三):Bool常量值的混淆

信息分享 信息分享 1382 人阅读 | 0 人回复 | 2021-01-17

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



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









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
回复

使用道具 举报