const parser = require("@babel/parser"); const generate = require("@babel/generator").default const traverse = require("@babel/traverse").default const types = require("@babel/types") const fs = require("fs"); const code = fs.readFileSync("XHS1.js", {encoding: "utf-8"}); const ast = parser.parse(code) const visitor = { VariableDeclarator(path) { if (path.node.id.name === "_garp_d40c") { arg = arg.arguments[0]; let _arrys = path.scope.getBinding(arg.name) } // let switchNode = path.node.body.body[0]; // // switch 语句内的控制流数组名,本例中是 _0x34e16a // let arrayName = switchNode.discriminant.object.name; // // 获取控制流数组绑定的节点 // let bindingArray = path.scope.getBinding(arrayName); // // 获取节点整个表达式的参数、分割方法、分隔符 // let init = bindingArray.path.node.init; // let object = init.callee.object.value; // let property = init.callee.property.value; // let argument = init.arguments[0].value; // // 模拟执行 '3,4,0,5,1,2'['split'](',') 语句 // let array = object[property](argument) // // 也可以直接取参数进行分割,方法不通用,比如分隔符换成 | 就不行了 // // let array = init.callee.object.value.split(','); // // switch 语句内的控制流自增变量名,本例中是 _0x2eff02 // let autoIncrementName = switchNode.discriminant.property.argument.name; // // 获取控制流自增变量名绑定的节点 // let bindingAutoIncrement = path.scope.getBinding(autoIncrementName); // // 可选择的操作:删除控制流数组绑定的节点、自增变量名绑定的节点 // bindingArray.path.remove(); // bindingAutoIncrement.path.remove(); // // 储存正确顺序的控制流语句 // let replace = []; // // 遍历控制流数组,按正确顺序取 case 内容 // array.forEach(index => { // let consequent = switchNode.cases[index].consequent; // // 如果最后一个节点是 continue 语句,则删除 ContinueStatement 节点 // if (types.isContinueStatement(consequent[consequent.length - 1])) { // consequent.pop(); // } // // concat 方法拼接多个数组,即正确顺序的 case 内容 // replace = replace.concat(consequent); // } // ); // // 替换整个 while 节点,两种方法都可以 // path.replaceWithMultiple(replace); // // path.replaceInline(replace); } } traverse(ast, visitor) const result = generate(ast) console.log(result.code)