From 85fb42e72b7196d3830b9bd28c08058f63278de1 Mon Sep 17 00:00:00 2001 From: aiyingfeng Date: Tue, 22 Aug 2023 12:20:08 +0800 Subject: [PATCH] =?UTF-8?q?12.AST=E6=93=8D=E4=BD=9C=E4=B9=8B=E5=A6=82?= =?UTF-8?q?=E4=BD=95=E6=8F=92=E5=85=A5=E8=8A=82=E7=82=B9-insertAfter-inser?= =?UTF-8?q?tBefore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 36 +++++++++++++++++++ .../decode_obfuscator.js | 30 ++++++++++++++++ .../encode.js | 1 + 3 files changed, 67 insertions(+) create mode 100644 AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/README.md create mode 100644 AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/decode_obfuscator.js create mode 100644 AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/encode.js diff --git a/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/README.md b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/README.md new file mode 100644 index 0000000..cfceaab --- /dev/null +++ b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/README.md @@ -0,0 +1,36 @@ +# AST操作之如何插入节点 + +需求:var a = 123;后面增加一个兄弟节点b = 111 + +```javascript +const fs = require('fs'); +const {parse} = require("@babel/parser"); +const traverse = require("@babel/traverse").default; +const generator = require("@babel/generator").default; +const t = require('@babel/types'); +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) { + let {id} = path.node; + // 这里一定要判断准确,否则会无限循环 + if(id.name == 'a'){ + let new_id = t.Identifier("b"); + let new_init = t.NumericLiteral(111); + let new_node = t.VariableDeclarator(new_id, new_init); + path.insertAfter(new_node) + } + }, +}; + +traverse(ast, visitor); + +// 将修改后的AST重新生成为代码 +const modifiedCode = generator(ast).code; +console.log(modifiedCode); +``` \ No newline at end of file diff --git a/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/decode_obfuscator.js b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/decode_obfuscator.js new file mode 100644 index 0000000..9d5970e --- /dev/null +++ b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/decode_obfuscator.js @@ -0,0 +1,30 @@ +const fs = require('fs'); +const {parse} = require("@babel/parser"); +const traverse = require("@babel/traverse").default; +const generator = require("@babel/generator").default; +const t = require('@babel/types'); +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) { + let {id} = path.node; + // 这里一定要判断准确,否则会无限循环 + if(id.name == 'a'){ + let new_id = t.Identifier("b"); + let new_init = t.NumericLiteral(111); + let new_node = t.VariableDeclarator(new_id, new_init); + path.insertAfter(new_node) + } + }, +}; + +traverse(ast, visitor); + +// 将修改后的AST重新生成为代码 +const modifiedCode = generator(ast).code; +console.log(modifiedCode); \ No newline at end of file diff --git a/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/encode.js b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/encode.js new file mode 100644 index 0000000..9d69cb3 --- /dev/null +++ b/AST抽象语法树/12.AST操作之如何插入节点-insertAfter-insertBefore/encode.js @@ -0,0 +1 @@ +var a = 123; \ No newline at end of file