利用AST对抗JavaScript混淆:核心知识总结
本文档旨在总结通过分析ast.html
及其中的相关链接,梳理出的利用抽象语法树(AST)对抗JavaScript混淆的核心技术与资源。
1. 核心概念:什么是AST?
**AST (Abstract Syntax Tree)**,即抽象语法树,是源代码语法结构的一种树状表示。它以树的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
对于JavaScript混淆来说,代码通常会被转化为难以阅读的格式,例如:
- 变量名替换(
a
,b
,c
) - 字符串加密到数组中,通过函数调用还原
- 控制流平坦化(使用
while
循环和switch
语句打乱代码执行顺序) - 代码无用化(插入不会被执行的“死代码”)
直接通过阅读或正则表达式来处理这种代码非常困难,但如果将其转换为AST,这些混淆手段在结构上就会变得清晰,从而可以通过程序化的方式进行分析和还原。
反混淆的本质:就是将混淆的JS代码 解析(Parse) 成AST,通过 遍历(Traverse) 和 操作(Manipulate) AST节点来还原代码逻辑,最后再将修改后的AST 生成(Generate) 为可读的代码。
2. 准备工作与环境搭建
要利用AST进行反混淆,需要一个Node.js环境,并安装Babel相关的核心工具库。
2.1. 环境
- Node.js: AST操作通常在Node.js环境中完成。
- VSCode: 推荐的代码编辑器,便于调试。
2.2. Babel核心依赖
Babel是一个强大的JavaScript编译器,其工具链是进行AST操作的事实标准。首先,需要初始化一个npm项目 (npm init
),然后安装以下核心依赖:
@babel/parser
: 将JavaScript代码解析成AST。1
npm install @babel/parser --save
@babel/traverse
: 提供了遍历AST节点的功能,这是反混淆操作的核心。1
npm install @babel/traverse --save
@babel/types
: 包含用于创建、验证和修改AST节点的方法。1
npm install @babel/types --save
@babel/generator
: 将修改后的AST重新生成为JavaScript代码。1
npm install @babel/generator --save
3. 反混淆流程与Babel API实践
一个典型的AST反混淆流程如下:
- 读取混淆代码:将混淆的JS代码作为字符串读入。
- **解析 (Parse)**:使用
@babel/parser
将代码字符串转换为AST。 - **遍历与操作 (Traverse & Manipulate)**:使用
@babel/traverse
编写一个“访问者”(Visitor)对象,遍历AST。在访问者中,针对特定类型的节点编写处理逻辑。 - **生成 (Generate)**:使用
@babel/generator
将处理过的AST转换回可读的JavaScript代码。
3.1. 关键API:path
对象
在使用@babel/traverse
进行遍历时,其提供给访问者函数的最重要的参数是path
对象。path
对象封装了AST节点及其与父节点、作用域等相关的所有上下文信息。
path
对象常用属性和方法:
-
path.node
: 当前正在访问的AST节点。 -
path.parent
: 父节点。 -
path.scope
: 当前节点的作用域信息,非常适合用于查找变量声明、重命名变量等。 -
path.replaceWith(newNode)
: 用一个新节点替换当前节点。 -
path.remove()
: 删除当前节点。 -
path.findParent(callback)
: 向上查找符合条件的父节点。 -
path.get(key)
: 获取子节点路径。
3.2. 示例:常量折叠
常量折叠是反混淆中一个常见的操作。例如,混淆代码中可能存在 const a = 1 + 2;
这样的表达式。通过AST可以计算出结果并直接替换。
1 |
|
4. 实用工具与参考资源
AST Explorer: astexplorer.net
一个在线工具,可以实时查看代码对应的AST结构。这是学习和调试AST操作必不可少的工具。JavaScript Obfuscator Tool: obfuscator.io
一个强大的在线JS混淆工具,可以作为逆向研究的目标。Babel官方手册 (中文翻译):
- 插件手册: github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md
学习如何编写Babel插件(即AST操作的核心逻辑)的权威指南。
- 插件手册: github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md
Babel Traverse API文档 (非官方但详尽):
- evilrecluse.top/Babel-traverse-api-doc/
一个非常详细的@babel/traverse
API文档,弥补了官方文档的不足。
- evilrecluse.top/Babel-traverse-api-doc/
掘金文章:玩转babel工具链:
- juejin.cn/post/7113800415057018894
对Babel工具链,特别是@babel/traverse
和scope
有深入的讲解。
- juejin.cn/post/7113800415057018894
5. 总结
利用AST对抗JavaScript混淆是一项强大而有效的技术。其核心在于将代码从无结构的文本转化为有结构的树,然后通过Babel等工具提供的强大API对树进行程序化的分析和修改。熟练掌握AST的理念、Babel工具链的使用以及常用反混淆技巧,是成为JS逆向工程师的关键技能之一。