文章总结: 本文详细介绍使用AST技术还原JavaScript逗号表达式的方法。通过分析SequenceExpression节点结构,将复合表达式拆分为独立ExpressionStatement节点,并提供完整代码实现和注意事项。关键步骤包括类型判断、节点遍历重构和替换操作,可有效提升代码可读性并保持执行逻辑不变。 综合评分: 85 文章分类: 代码审计,WEB安全,安全工具,逆向分析,安全开发
AST 技巧:还原逗号表达式
原创
LLLibra146 LLLibra146
LLLibra146
2025年6月10日 08:00 北京
在小说阅读器读本章
去阅读
大家好,今天分享使用 AST 去除逗号表达式的方法。
逗号表达式
var a = 1;
var b = 2;
var c = 3;
a += 1, b += 1, c += 1,d+=1,s(),c(),f=function(){};
逗号表达式大家应该都不陌生了,像上面这种将多个表达式写在一行的代码,在混淆的 JS 中随处可见,下面我们就依此为例来还原它。
将其复制到在线 AST 网站,将代码解析为 AST 语法树,并且观察语法树的结构。
image-20250609214854764
image-20250609215444692
观察规律,发现逗号表达式其实是个 ExpressionStatement 节点,并且它里面有一个 expression 属性,是一个 SequenceExpression 节点,SequenceExpression 节点有一个 expressions 属性,expressions 属性里面就是所有的表达式。
到这里逗号表达式的 AST 语法树结构就搞清楚了。那应该如何将其还原成正常的表达式呢?来看看正常的表达式的 AST 语法树的结构是什么样子的,先手动还原一下哈哈哈。
image-20250609215739225
对比上图和之前的逗号表达式会发现,正常的表达式都是一个 ExpressionStatement 节点,并且它的 expression 属性就是一个 AssignmentExpression 节点或者其他类型的节点。
也就是说,要想将逗号表达式还原,那就要将刚才的每个节点都构造成一个 ExpressionStatement 节点即可,ExpressionStatement 节点的 expression 就是每个表达式本身。
还原逗号表达式
有了前面的思路,代码就很简单了。
const processSequenceExpression = {
ExpressionStatement: {
exit(path) {
let {node} = path;
//保存所有的节点
let nodes = [];
//别忘了判断节点类型,可能会死循环
if (!types.isSequenceExpression(node.expression)) {
return
}
//为每个节点生成一个ExpressionStatement节点
for (const expression of node.expression.expressions) {
nodes.push(types.expressionStatement(expression));
}
//替换原来的节点
path.replaceWithMultiple(nodes);
}
}
}
traverse(ast, processSequenceExpression);
首先获取到逗号表达式节点,然后遍历它的 expressions 属性,将里面的所有内容构造成一个个 ExpressionStatement 节点,最后使用刚才构造的节点数组替换原有的节点即可。
运行结果:
image-20250609221123453
逗号表达式已经被拆分开,并且不影响代码的执行逻辑。
对了,别忘了判断节点类型,因为正常的 ExpressionStatement 节点的 expression 属性不会是 SequenceExpression 类型,这里要判断一下防止死循环,只需要处理逗号表达式节点即可。
代码量不多,大家可以自己试一下,如果看不懂可以单步调试一下,有利于理解 AST 的运行逻辑。
最近一直有小伙伴问我有没有交流群,为了能让大家更好的交流,我组建了一个逆向交流群,想要进群的小伙伴可以在后台点击“联系我”菜单或者扫码,添加微信并且备注“交流群”,我会拉你进群。
推荐阅读:
AST 技巧:压缩变量定义
JS调试技巧:避免控制台卡死的日志断点使用技巧
0基础1分钟解密任何HTTPS加密流量
JS调试技巧:如何让时间和随机数“听你指挥”?升级版!
AST 技巧:模版(template)的高级用法
如何在浏览器中使用 AST 实时反混淆?(附AST模版可直接使用)
AST 使用技巧:如何快速分析混淆代码结构
在 JS逆向时如何 hook 属性?
如何 “正确” hook JS方法
一日一技:反爬虫的极致手段,几行代码直接炸了爬虫服务器
JS调试技巧:如何让时间和随机数“听你指挥”?
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:LLLibra146 LLLibra146 LLLibra146《AST 技巧:还原逗号表达式》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论