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
|
|
|
|
|