利用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反混淆流程如下:

  1. 读取混淆代码:将混淆的JS代码作为字符串读入。
  2. **解析 (Parse)**:使用@babel/parser将代码字符串转换为AST。
  3. **遍历与操作 (Traverse & Manipulate)**:使用@babel/traverse编写一个“访问者”(Visitor)对象,遍历AST。在访问者中,针对特定类型的节点编写处理逻辑。
  4. **生成 (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
2
3
4
5
6
7
8
9
10
11
const visitor = {
BinaryExpression(path) {
const { left, right, operator } = path.node;
// 确保左右两边都是数字
if (t.isNumericLiteral(left) && t.isNumericLiteral(right)) {
const result = eval(`${left.value} ${operator} ${right.value}`);
// 用计算结果创建一个新的数字字面量节点并替换原有表达式
path.replaceWith(t.numericLiteral(result));
}
}
};

4. 实用工具与参考资源

5. 总结

利用AST对抗JavaScript混淆是一项强大而有效的技术。其核心在于将代码从无结构的文本转化为有结构的树,然后通过Babel等工具提供的强大API对树进行程序化的分析和修改。熟练掌握AST的理念、Babel工具链的使用以及常用反混淆技巧,是成为JS逆向工程师的关键技能之一。


https://kingjem.github.io/2025/06/29/逆向/ast_summary/
作者
Ruhai
发布于
2025年6月29日
许可协议