From dd7704326822336db27d5366a10a5bdf1d5c1e8e Mon Sep 17 00:00:00 2001 From: aiyingfeng Date: Tue, 18 Jul 2023 18:33:16 +0800 Subject: [PATCH] =?UTF-8?q?AST=E6=93=8D=E4=BD=9C=E4=B9=8B=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E8=8A=82=E7=82=B9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../9.AST操作之构造节点信息/README.md | 43 +++++++++++++++++++ .../9.AST操作之构造节点信息/decode_obfuscator.js | 36 ++++++++++++++++ .../9.AST操作之构造节点信息/encode.js | 1 + AST抽象语法树/README.md | 4 ++ 4 files changed, 84 insertions(+) create mode 100644 AST抽象语法树/9.AST操作之构造节点信息/README.md create mode 100644 AST抽象语法树/9.AST操作之构造节点信息/decode_obfuscator.js create mode 100644 AST抽象语法树/9.AST操作之构造节点信息/encode.js diff --git a/AST抽象语法树/9.AST操作之构造节点信息/README.md b/AST抽象语法树/9.AST操作之构造节点信息/README.md new file mode 100644 index 0000000..b6836a1 --- /dev/null +++ b/AST抽象语法树/9.AST操作之构造节点信息/README.md @@ -0,0 +1,43 @@ +# AST操作之构造节点信息 + +需求:将var a;将其转化为var a = 1 + 2; + +```javascript +const fs = require('fs'); +const {parse} = require("@babel/parser"); +const traverse = require("@babel/traverse").default; +const generator = require("@babel/generator").default; +let encode_file = "./encode.js"; + +let js_code = fs.readFileSync(encode_file, {encoding: "utf-8"}); +let ast = parse(js_code, { + sourceType: 'module', +}); + +const visitor = { + VariableDeclarator(path) { + // 使用解构赋值语法 {} 是用来从对象中提取特定属性或方法 + const {init} = path.node + console.log({init}) + const node = { + type: "BinaryExpression", + operator: "+", + left: { + type: "NumericLiteral", + value: 1 + }, + right: { + type: "NumericLiteral", + value: 2 + } + } + // 在 JavaScript 中,|| 是逻辑运算符之一,表示逻辑或(OR) + init || path.set("init", node) + }, +} + +traverse(ast, visitor); +let {code} = generator(ast); +console.log(code) +``` + diff --git a/AST抽象语法树/9.AST操作之构造节点信息/decode_obfuscator.js b/AST抽象语法树/9.AST操作之构造节点信息/decode_obfuscator.js new file mode 100644 index 0000000..e283d34 --- /dev/null +++ b/AST抽象语法树/9.AST操作之构造节点信息/decode_obfuscator.js @@ -0,0 +1,36 @@ +const fs = require('fs'); +const {parse} = require("@babel/parser"); +const traverse = require("@babel/traverse").default; +const generator = require("@babel/generator").default; +let encode_file = "./encode.js"; + +let js_code = fs.readFileSync(encode_file, {encoding: "utf-8"}); +let ast = parse(js_code, { + sourceType: 'module', +}); + +const visitor = { + VariableDeclarator(path) { + // 使用解构赋值语法 {} 是用来从对象中提取特定属性或方法 + const {init} = path.node + console.log({init}) + const node = { + type: "BinaryExpression", + operator: "+", + left: { + type: "NumericLiteral", + value: 1 + }, + right: { + type: "NumericLiteral", + value: 2 + } + } + + init || path.set("init", node) + }, +} + +traverse(ast, visitor); +let {code} = generator(ast); +console.log(code) \ No newline at end of file diff --git a/AST抽象语法树/9.AST操作之构造节点信息/encode.js b/AST抽象语法树/9.AST操作之构造节点信息/encode.js new file mode 100644 index 0000000..3e62046 --- /dev/null +++ b/AST抽象语法树/9.AST操作之构造节点信息/encode.js @@ -0,0 +1 @@ +var a; \ No newline at end of file diff --git a/AST抽象语法树/README.md b/AST抽象语法树/README.md index b995ad6..1462bfd 100644 --- a/AST抽象语法树/README.md +++ b/AST抽象语法树/README.md @@ -4,3 +4,7 @@ https://blog.csdn.net/weixin_52057903/article/details/129131582 +babel文档 + +https://babeljs.io/docs/babel-types +