AST技巧:还原逗号表达式

admin 2026-04-16 04:46:07 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍使用AST技术还原JavaScript逗号表达式的方法。通过分析SequenceExpression节点结构,将复合表达式拆分为独立ExpressionStatement节点,并提供完整代码实现和注意事项。关键步骤包括类型判断、节点遍历重构和替换操作,可有效提升代码可读性并保持执行逻辑不变。 综合评分: 85 文章分类: 代码审计,WEB安全,安全工具,逆向分析,安全开发


cover_image

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 技巧:还原逗号表达式》

评论:0   参与:  0