JS代码混淆详细流程之AST
AST语法树分析
构建 JavaScript 抽象语法树(Abstract Syntax Tree,AST)是将 JavaScript 代码解析成一种更易于分析和处理的树状结构的过程。以下是构建 JavaScript AST 的详细步骤:
1. **词法分析(Lexical Analysis)**:
- 将输入的 JavaScript 代码字符串分解成一个个的词法单元(Token),如标识符、关键字、操作符等。
- 去掉无关的空格、注释等。
2. **语法分析(Syntax Analysis)**:
- 使用语法规则将词法单元组合成语法结构,形成语法树。
- 根据 JavaScript 语言规范,将词法单元组合成语法结构,识别出各种语法元素,如变量声明、函数定义、表达式等。
3. **抽象语法树构建(Abstract Syntax Tree Construction)**:
- 遍历语法树节点,创建一个抽象的树状结构,表示 JavaScript 代码的语法结构。
- 每个节点代表一个语法单元,如变量声明、函数声明、赋值表达式等,节点之间相互关联,形成树形结构。
4. **遍历和分析语法树**:
- 对构建好的 AST 进行遍历分析,可以进行静态分析、优化或代码转换等操作。
- 遍历可以采用深度优先或广度优先的算法,访问每个节点并对节点进行操作或处理。
- 可以根据需要进行代码优化、转换以及添加新的语法等操作。
总结来说,构建 JavaScript AST 的过程主要包括词法分析、语法分析、抽象语法树构建、遍历分析和生成代码等步骤。构建 AST 可以帮助开发者更好地理解和处理 JavaScript 代码,实现静态分析、代码转换、优化等功能。
语法节点类型
在 JavaScript 的抽象语法树(AST)中,通常会包含多种不同类型的节点,每种节点代表着 JavaScript 代码中的不同语法结构。以下是一些常见的 JavaScript AST 节点类型:
1. **Program**:代表整个 JavaScript 程序,是 AST 的根节点。
2. **FunctionDeclaration**:代表函数声明。
3. **FunctionExpression**:代表函数表达式。
4. **VariableDeclaration**:代表变量声明。
5. **Identifier**:代表标识符,如变量名、函数名等。
6. **Literal**:代表字面量,如数字、字符串等。
7. **BinaryExpression**:代表二元表达式,如加法、减法等。
8. **UnaryExpression**:代表一元表达式,如取反、递增等。
9. **AssignmentExpression**:代表赋值表达式。
10. **ConditionalExpression**:代表条件表达式(三元运算符)。
11. **CallExpression**:代表函数调用表达式。
12. **MemberExpression**:代表成员表达式,如对象属性访问。
13. **ObjectExpression**:代表对象字面量。
14. **ArrayExpression**:代表数组字面量。
15. **BlockStatement**:代表代码块。
16. **IfStatement**:代表条件语句(if语句)。
17. **ForStatement**:代表for循环语句。
18. **WhileStatement**:代表while循环语句。
19. **ReturnStatement**:代表返回语句。
20. **TryStatement**:代表try-catch语句。
这些语法类型是ECMASCRIPT语法规则的基本单元,后续章节介绍语法树的变换操作都是对这些语句进行修改,然后组装成新的混淆后的语句
常见的 JavaScript 语法树分析引擎包括以下几个:
1. **Babel**:Babel 是一个广泛使用的 JavaScript 编译器,可以将现代 JavaScript 代码转换成向后兼容的代码。它使用了 Acorn 作为 JavaScript 解析器,并将解析后的代码转换成 AST 进行分析和转换。
2. **Esprima**:Esprima 是一个独立的、快速的 ECMAScript 解析器,用于将 JavaScript 代码解析成 AST,方便进行静态分析、代码转换等操作。Esprima 是一个流行的工具,被广泛用于 JavaScript AST 的构建。
3. **Esprima-FB**:Esprima-FB 是 Facebook 提供的修改版 Esprima 解析器,针对一些特定需求进行了优化和改进。它通常用于 Facebook 的一些开源工具和项目中。
4. **Acorn**:Acorn 是一个小巧、快速的 JavaScript 解析器,可将 JavaScript 代码解析成 AST。它被广泛用于构建 JavaScript AST,支持 ECMAScript 最新的标准,并提供了一些可选插件和选项。
5. **ESTree**:ESTree 定义了一个统一的 JavaScript AST 的规范,包括了节点类型、属性等内容,旨在使不同的 JavaScript AST 工具具备更好的兼容性。许多 JavaScript AST 工具都符合 ESTree 的规范,以便于不同工具之间的互操作性。
有了这些引擎,我们想做自己的代码混淆工具就简单的多了。关注我,后续介绍如何进行AST语法转换。