AST逆向模板

572 阅读1分钟
// ast逆向还原模板

//-------------- 所需解析库 -----------------------
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const t = require("@babel/types");
const generator = require("@babel/generator").default;
const fs = require("fs");


//-------------------- 写自己的解析逻辑函数 start ----------
// 删除节点中的extra属性(二进制、Unicode等编码 -> utf-8)
function replace_unicode(path) {
    let node = path.node;
    if (node.extra === undefined)
        return;
    delete node.extra;
}

.............//使用时删除写逻辑

//-------------------- 写自己的解析逻辑函数 end ----------

// 需要解码的文件位置
let encode_file = "sources.js"
// 解码后的文件位置
let decode_file = "sources_decode.js"

// 读取需要解码的js文件, 注意文件编码为utf-8格式
let jscode = fs.readFileSync(encode_file, {encoding: "utf-8"});

// 将js代码修转成AST语法树
let ast = parser.parse(jscode);


const visitor = {
    //..........写自己的解析逻辑函数  重点 如
    StringLiteral: {
        enter: [replace_unicode]
    },
    .............//使用时删除写逻辑
}


// 遍历语法树节点,调用修改函数
traverse(ast, visitor);

// 将ast转成js代码,{jsescOption: {"minimal": true}} unicode -> 中文
let {code} = generator(ast, opts = {jsescOption: {"minimal": true}});
// 将js代码保存到文件
fs.writeFile(decode_file, code, (err) => {
});