前几天帮助小伙伴反混淆obfuscator代码的时候,遇到了一个非常奇葩的问题。以至于无法使用TypeScript代码解决。后不得已采用了其他语言进行的处理。这个哥们要分析的代码量非常的大。大概有4M的样子。其中很多符号被转义了。dejs.vip站点,期初没有对转义字符进行处理,页面中就无法完成这个功能。
既然答应帮别人解决问题了,就启用了手动分析模式。其中obfuscator混淆代码中常见的转义字符有
\x20,\x27,\xa,\x22 分别对应的是:空格,单引号,换行符,双引号
但是在进行单引号替换的时候,就发现了问题。对应的TypeScript代码如下:
let strs :string= String.raw `'I\x27\x27 'm a teapot'`;
let demo :string = "'I\x27\x27 'm a teapot'";
let row :string= String.raw `${demo}`;
let test :string = `'I\x27\x27 'm a teapot'`;
let nex :string = String.raw `${test}`;
console.info(strs.replace(/\\x27/g,"__##__"));
console.info(demo.replace(/\\x27/g,"__##__"));
console.info(row.replace(/\\x27/g,"__##__"));
console.info(nex.replace(/\\x27/g,"__##__"));
其中tsconfig.json对应的文件内容如下:
{
"compilerOptions": {
"lib": [
"es2015","DOM"
],
}
}
执行后对应的结果是:
'I__##____##__ 'm a teapot'
'I'' 'm a teapot'
'I'' 'm a teapot'
'I'' 'm a teapot'
从结果中我们可以看出,只有使用String.raw 最原始的方法才行。其中下面这种方式并不能解决。这也就意味这,我并不能通过文件读取,将内容赋值与一个变量,然后进行替换解决。
let demo :string = "'I\x27\x27 'm a teapot'";
let row :string= String.raw `${demo}`;
这个时候我的好奇心就来了,这是不是语言的缺陷。于是乎我就使用JavaScript进行了验证。
let rawStr= String.raw `'I\x27\x27 'm a teapot'`;
let originStr = "'I\x27\x27 'm a teapot'";
let otherRaw = String.raw `${originStr}`;
let test = `'I\x27\x27 'm a teapot'`;
let nextStr = String.raw `${test}`;
console.info(rawStr.replace(/\\x27/g,"__##__"));
console.info(originStr.replace(/\\x27/g,"__##__"));
console.info(otherRaw.replace(/\\x27/g,"__##__"));
console.info(nextStr.replace(/\\x27/g,"__##__"));
console.info(nextStr.replaceAll(String.raw `\x27`,"__##__")); //注意这个方式,从python中学的方式,但是js中并不能起作用。
执行结果如下:
'I__##____##__ 'm a teapot'
'I'' 'm a teapot'
'I'' 'm a teapot'
'I'' 'm a teapot'
结果竟然完全一致,这就说明不是TypeScript语言的问题。JavaScript现在也无法解决。只能借助其他语言了。这时候选择了自己喜欢的Python.
line = r'''I\x27\x27 'm a teapot'''
print(line.replace(r"\x27","__##__"))
#demo.txt文件内容就是字符串中的内容。
with open("demo.txt") as file:
content = file.read()
print(content.replace(r"\x27","__##__"))
结果非常简单的解决了。
这也意味这,我项目升级的时候,需要借助python脚本才能将转义字符替换。由于反混淆代码使用的TypeScript,其中还没有nodejs的环境。复杂度瞬间上去了。先实现后面再找优化方案吧。