抽象语法树 AST

源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构

抽象表示把 js 代码进行了结构化的转化,转化为一种数据结构。这种数据结构其实就是一个大的 json 对象

简单理解,就是把代码按照一定的规则转换成一种树形结构


示例

  1. 一组简单的 AST 树状结构,转换前:
const team = '我是一个示例'

转换后:

{
  "type": "Program",
  "start": 0,
  "end": 18,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 18,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 6,
          "end": 18,
          "id": {
            "type": "Identifier",
            "start": 6,
            "end": 8,
            "name": "team"
          },
          "init": {
            "type": "Literal",
            "start": 11,
            "end": 18,
            "value": "我是一个示例",
            "raw": "'我是一个示例'"
          }
        }
      ],
      "kind": "const"
    }
  ],
  "sourceType": "module"
}
  1. 拆解一个简单的 add 函数,转换前:
function add(a, b) {
   return a + b
}

转换后:

{
  "type": "Program",
  "start": 0,
  "end": 38,
  "body": [
    {
      "type": "FunctionDeclaration",
      "start": 0,
      "end": 38,
      "id": {
        "type": "Identifier",
        "start": 9,
        "end": 12,
        "name": "add"
      },
      "expression": false,
      "generator": false,
      "async": false,
      "params": [
        {
          "type": "Identifier",
          "start": 13,
          "end": 14,
          "name": "a"
        },
        {
          "type": "Identifier",
          "start": 16,
          "end": 17,
          "name": "b"
        }
      ],
      "body": {
        "type": "BlockStatement",
        "start": 19,
        "end": 38,
        "body": [
          {
            "type": "ReturnStatement",
            "start": 24,
            "end": 36,
            "argument": {
              "type": "BinaryExpression",
              "start": 31,
              "end": 36,
              "left": {
                "type": "Identifier",
                "start": 31,
                "end": 32,
                "name": "a"
              },
              "operator": "+",
              "right": {
                "type": "Identifier",
                "start": 35,
                "end": 36,
                "name": "b"
              }
            }
          }
        ]
      }
    }
  ],
  "sourceType": "module"
}

生成抽象语法树


语法树还原成代码

escodegen 将 JavaScript AST 转化为代码

  1. 使用 npm 命令安装 escodegen 模块:
npm i escodegen -g
  1. 使用 escodegen 将 js 语句的 AST 语法树 —— json 文件转化成 js 代码:
esgenerate json文件名

代码执行

  • 得到的 js 代码可以直接 F12 后在浏览器的控制台中运行

CTF - REVERSE_JS逆向1.png

  • 使用 nodejs 来运行
node 文件名