61 lines
2.7 KiB
JavaScript
61 lines
2.7 KiB
JavaScript
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) |