hex解码\x27中遇到的问题

前几天帮助小伙伴反混淆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的环境。复杂度瞬间上去了。先实现后面再找优化方案吧。

end
  • 作者:kali(作者介绍)
  • 更新时间:2022-07-20 18:09
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:转载站点文章,请附上原文链接
  • 翻译声明:翻译文章会不严谨,请务必附上原文链接
  • 扫描阅读:扫描二维码,手机阅读该文章