中间人的妙用:自动反混淆 JS 代码并移除反调试代码
大家好,今天分享一种通过中间人的方式自动AST 反混淆的方案。
中间人
所谓中间人,其实就是中间人攻击,说白了就是抓包,通过抓包软件可以修改请求或者响应,配合抓包软件的脚本功能就可以实现在获取到响应之后进行 AST 反混淆。然后返回反混淆后的 JS 代码,即可实现全自动反混淆,以后动态调试 JS 代码不用再把眼睛看瞎啦,哈哈。
示例网站
这里拿猿人学的练习平台第 61 题作为示例,先看看未进行反混淆之前的代码长什么样子:
代码中的部分字符串被转成了十六进制的 ASCII 码,好多数字都被转成了十六进制,并且结果是动态计算的,无法一眼看出来是什么值。这还只是简单的 webpack,如果加上 OB 混淆的话,代码的可读性会更低,调试起来更难。
自动 AST 反混淆
首先打开抓包软件,我这里用的是 proxyman,它的脚本功能比较好用,可以执行自定义的脚本。
要完成自动反混淆,有三个步骤:
- 抓包软件要支持执行自定义脚本,我这里使用 proxyman,它是支持的。
- 要有反混淆脚本,例如可以将十六进制的 ASCII 码转回字符串的 AST 脚本。
- AST 脚本需要
babel
库才能正常执行,proxyman 中不提供原生的babel
库。
以上三个步骤中,第一个步骤是支持的,第二个步骤如果不知道如何还原可以看之前的文章:JS逆向实战:AST技术让你轻松破解OB混淆保护,第三个步骤可以看上篇文章:如何在浏览器中使用 nodejs 模块进行反混淆?。
在 proxyman 的脚本环境中,nodejs 版本的 babel
库无法正常运行,如果将其拷贝到脚本目录中导入的话会报错。
从官方文档中可以看到,proxyman 只能使用 @users
这个作用域下的模块,并且不支持一些 require
导入方式,具体支持到什么程度官方没有提,但是原封不动的将 babel
模块拷贝进去就会报上面的错误。
解决方案就是将 babel 库全部打包到单个的 JS 文件中,打包方法可以看上篇文章:如何在浏览器中使用 nodejs 模块进行反混淆?
打包好以后放到目录中即可,目录位置是:~/Library/Application\ Support/com.proxyman.NSProxy/users
,这个目录是自定义模块的目录,不会被 proxyman 的更新操作删除,除非你自己删除它。
完成了上面的三个步骤后,就可以开始编写反混淆代码了。写好代码后将其粘贴进脚本功能模块中,像下面这样:
别忘了将打包好的 babel 库放到对应的目录位置,并且在脚本中导入它。
完成以后保存并激活反混淆脚本,刷新浏览器,如果以上步骤都没有问题的话,你会看到这样的效果:
字符串中的十六进制 ASCII 码已经被还原,并且动态计算的十六进制数字也已经被计算,现在代码的可读性已经大大的提高了,并且可以正常的获取到数据,说明反混淆的结果不影响代码的执行。
至于自动移除反调试代码,这个我这里就不做演示了,因为需要根据具体情况具体分析,如果只有 debugger
语句,那直接遍历 DebuggerStatement
节点并且移除即可。更多的反调试语句需要具体分析后才能写出具体的移除代码,大家可以自己试一试。
总结
以上就是通过中间人的方式自动 AST 反混淆的方法了,上面只是做了一个简单的示范,具体能做到哪种程度主要就看 AST 反混淆的程度了,感兴趣的小伙伴可以自己试试。
本文章首发于个人博客 LLLibra146’s blog
本文作者:LLLibra146
更多文章请关注公众号 (LLLibra146):
版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!