前文
上节我们处理了内存爆破问题
然后直接提取出来解密字符串
然后写一下解密字符串代码
traverse(ast, {
CallExpression(path) {
if (path.node.callee?.name === "b") {
if (path.node.arguments.length !== 2) {
return;
}
let first = path.node.arguments[0].value;
let second = path.node.arguments[1].value;
let str_node = types.stringLiteral(ob_func.crp_name(first, second));
path.replaceInline(str_node);
}
},
});
可以看到已经解开了
但是字符串还是来回拼接的
所以我们用ast给组合一下
这里直接多循环生成几次代码就好了
之所以反复parse是因为实践多次操作会导致操作乱七八糟的错误问题(不明
所以我们反复循环解析再设置
代码很简单,循环一下就ok
traverse(ast, {
BinaryExpression(path) {
if (path.node.operator === "+") {
let left = path.node.left;
let right = path.node.right;
if (left.type === "StringLiteral" && right.type === "StringLiteral") {
let str_node = types.stringLiteral(left.value + right.value);
path.replaceInline(str_node);
}
}
},
});
可以看到这时候已经具备一定的可读性了
结语
撒花~