From c105df4f25a7cfdf7c3cec985a464f0af0d4248f Mon Sep 17 00:00:00 2001 From: luzhisheng Date: Thu, 20 Jul 2023 00:28:22 +0800 Subject: [PATCH] =?UTF-8?q?AST=E6=93=8D=E4=BD=9C=E4=B9=8Btemplate=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10.AST操作之template构建节点/README.md | 98 +++++++++++++++++++ .../decode_obfuscator.js | 35 +++++++ .../10.AST操作之template构建节点/encode.js | 1 + 3 files changed, 134 insertions(+) create mode 100644 AST抽象语法树/10.AST操作之template构建节点/README.md create mode 100644 AST抽象语法树/10.AST操作之template构建节点/decode_obfuscator.js create mode 100644 AST抽象语法树/10.AST操作之template构建节点/encode.js diff --git a/AST抽象语法树/10.AST操作之template构建节点/README.md b/AST抽象语法树/10.AST操作之template构建节点/README.md new file mode 100644 index 0000000..f431626 --- /dev/null +++ b/AST抽象语法树/10.AST操作之template构建节点/README.md @@ -0,0 +1,98 @@ +# AST操作之template构建节点 + +它允许你使用自定义的代码模板来构建 AST 节点,而不需要手动创建和操作 AST 节点对象。 + +需求:构建节点`var global_0 = 1,global_1 = 2,global_2 = 3;` + +```javascript +const {parse} = require("@babel/parser"); +const types = require("@babel/types"); +const template = require("@babel/template").default; +const generator = require("@babel/generator").default; + +let ast = parse("", { + sourceType: 'module', +}); + +// 定义源代码模板 +VAR_NODE = template(`var A = 1,B = 2, C = 3`); + +// 构建 AST 节点的数据 +let firstVar = types.identifier('global_0'); +let secondVar = types.identifier('global_1'); +let thirdVar = types.identifier('global_2'); +let newNode = VAR_NODE({A: firstVar, B: secondVar, C: thirdVar}); +ast.program.body.push(newNode); + +// 将 AST 节点转换为代码 +let {code} = generator(ast); +console.log(code); +``` + +需求:构建节点_0x6f2ba4 = 666; + +```javascript +const {parse} = require("@babel/parser"); +const types = require("@babel/types"); +const template = require("@babel/template").default; +const generator = require("@babel/generator").default; + +let ast = parse("", { + sourceType: 'module', +}); + +// 定义源代码模板 +VAR_NODE = template('A = B'); + +// 构建 AST 节点的数据 +let firstVar = types.identifier('_0x6f2ba4'); +let secondVar = types.valueToNode(666); +let newNode = VAR_NODE({A: firstVar, B: secondVar}); +ast.program.body.push(newNode); + +// 将 AST 节点转换为代码 +let {code} = generator(ast); +console.log(code); +``` + +需求:构建节点方法二_0x6f2ba4 = 666; + + @babel/parser 中的 parseExpression 函数来解析值并将其转换为一个有效的表达式节点。请确保在 buildAST 函数中使用 parseExpression 来正确解析 "VALUE" 占位符: + +```javascript +const template = require("@babel/template").default; +const { parseExpression } = require("@babel/parser"); +const generate = require("@babel/generator").default; + +// 定义源代码模板 +const sourceCodeTemplate = `VARIABLE_NAME = VALUE;`; + +// 使用 @babel/template 构建 AST 节点 +function buildAST(variableName, value) { + // 将值解析为表达式节点,以创建一个有效的 AST 节点 + const parsedValue = parseExpression(value.toString()); + + // 使用 @babel/template 创建带有正确替换的 AST 节点 + const astTemplate = template(sourceCodeTemplate); + const astNode = astTemplate({ + VARIABLE_NAME: variableName, + VALUE: parsedValue, // 使用有效的表达式节点替换 VALUE + }); + + return astNode; +} + +// 将 AST 节点转换为代码 +function generateCodeFromAST(astNode) { + const { code } = generate(astNode); + return code; +} + +// 测试代码 +const variableName = "_0x6f2ba4"; +const value = 666; +const astNode = buildAST(variableName, value); +const generatedCode = generateCodeFromAST(astNode); + +console.log(generatedCode); +``` \ No newline at end of file diff --git a/AST抽象语法树/10.AST操作之template构建节点/decode_obfuscator.js b/AST抽象语法树/10.AST操作之template构建节点/decode_obfuscator.js new file mode 100644 index 0000000..dbad906 --- /dev/null +++ b/AST抽象语法树/10.AST操作之template构建节点/decode_obfuscator.js @@ -0,0 +1,35 @@ +const template = require("@babel/template").default; +const { parseExpression } = require("@babel/parser"); +const generate = require("@babel/generator").default; + +// 定义源代码模板 +const sourceCodeTemplate = `VARIABLE_NAME = VALUE;`; + +// 使用 @babel/template 构建 AST 节点 +function buildAST(variableName, value) { + // 将值解析为表达式节点,以创建一个有效的 AST 节点 + const parsedValue = parseExpression(value.toString()); + + // 使用 @babel/template 创建带有正确替换的 AST 节点 + const astTemplate = template(sourceCodeTemplate); + const astNode = astTemplate({ + VARIABLE_NAME: variableName, + VALUE: parsedValue, // 使用有效的表达式节点替换 VALUE + }); + + return astNode; +} + +// 将 AST 节点转换为代码 +function generateCodeFromAST(astNode) { + const { code } = generate(astNode); + return code; +} + +// 测试代码 +const variableName = "_0x6f2ba4"; +const value = 666; +const astNode = buildAST(variableName, value); +const generatedCode = generateCodeFromAST(astNode); + +console.log(generatedCode); diff --git a/AST抽象语法树/10.AST操作之template构建节点/encode.js b/AST抽象语法树/10.AST操作之template构建节点/encode.js new file mode 100644 index 0000000..34e59ae --- /dev/null +++ b/AST抽象语法树/10.AST操作之template构建节点/encode.js @@ -0,0 +1 @@ +var global_0 = 1,global_1 = 2,global_2 = 3; \ No newline at end of file