前面一篇文章 AST解混淆之处理数值与字符串 介绍过unicode或者utf8编码的字符串还原的方法,但是如果这个字符串是中文,这个方法并不会奏效,比如有下面这段代码:

1
var a = "\u4f60\u597d\u0041\u0053\u0054";

经过前面的插件处理之后,结果为:

1
var a = "\u4F60\u597DAST";

可以看到unicode编码的中文并没有还原。

要想还原unicode编码的中文,必须用到generate函数有个 options选项,下面是这个选项能完成的功能:

图片
图片

所以修改我们的插件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//babel库及文件模块导入
const fs = require('fs');

//babel库相关,解析,转换,构建,生产
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const types = require("@babel/types");
const generator = require("@babel/generator").default;

//读取文件
if (process.argv.length < 4) {
console.log("Usage: node ${file}.js ${encode}.js ${decode}.js");
process.exit(1);
}

let input_file = process.argv[2], output_file = process.argv[3];

let jscode = fs.readFileSync(input_file, {encoding: "utf-8"});
//转换为ast树
let ast = parser.parse(jscode);

const visitor = {
StringLiteral({node})
{
if (node.extra && /\\[ux]/gi.test(node.extra.raw)) {
node.extra = undefined;
}
},
}

//some function code

//调用插件,处理源代码
traverse(ast, visitor);

//生成新的js code,并保存到文件中输出
let {code} = generator(ast, opts = {jsescOption:{"minimal":true}});
fs.writeFile(output_file, code, (err)=>{});

运行结果:

https://raw.githubusercontent.com/lyy077/blg-pic/main/pic/WX20220630-201530.png
https://raw.githubusercontent.com/lyy077/blg-pic/main/pic/WX20220630-201530.png