在探索Electron asar 解压过程过程中,接触到了obfuscator混淆压缩技术,这也是一项老技术了额,也是较为简单的混淆加密方式,在没有使用webpack打包的情况下,用这个更简单方便,总还是有些人望而生畏的。
后来在github找到了js-deobfuscator反混淆源码,这里感谢作者提供,代码很好用,但是网页版配置的几个参数好像失效了,导致很多代码无法翻译,后来还找到了一个JavaScript Deobfuscator
不过跟作者沟通后,发现这个在线工具也是使用的同样的代码,所以这里还是回过头来解读下作者的源码是怎么运行的,以及还有哪些坑需要填,填坑我最爱!
环境准备
node.js == 18+ (请务必使用nvm use 进行node.js版本控制)
pnpm
技能分析
1. 这里作者用了多项目管理,将deob包放在当前项目下,又通过workspace安装到node_modules下,这会让新手使用一脸懵,明明改了这里的代码,为何运行时没有输出自己加的console.log?
那时因为这里实际运行的时候执行的时node_modules下的代码,而debug映射到的代码是package/deob代码,这点不知道webstorm怎么做到的
逐步填坑
看上面看得一脸懵?
首先我一直没有用vs code的习惯,所以这里就用webstorm来讲解,作者还是透露了一些线索,作者用nuxt.js开发的website,也就是你们看到的在线站,本地是运行不起来了,原因未知,我也没具体问,因为不太重要,自己想搞,用vue脚手架也可以很快地搞出来,没啥讨论的点,另外如果现在想搞SEO的静态站vitepress更屌比,也更简单,也是基于vue框架,大家自建站,可以尝试
我找到了package.json,找到了执行tmp的命令,这里我们来说明下,这里用到了一个命令叫deob,但是下面的依赖包没有这个东西,我npm玩得不好,当时没搞明白,后来让chatgpt-4o来分析下,它让我找找cli.ts/js文件试试,结果在package/deob/src找到了,说明这里deob的命令来源于这里,后期可以补一个npm本地命令创建技术,以后自己也可以倒腾命令了
右键debug时,如果你的webstorm没有debug,那可能是你把这个插件给关了,记得开启,这个太强大,不可或缺,喜欢打console.log的可以跳过
开启debugger插件
我搞了两个核心参数,重新debug时发现没屌用
后来又了解了一下npm workspace,然后才知道改了package中的东西,需要重新执行 `pnpm i` 才能把代码安到node_modules中去
再讲讲第一个参数`inlineWrappersDepth` 的意义,因为混淆会在函数外有一层,还会在函数里再来一层,所以如果深度默认是2,函数里的混淆代码就不会被解释,看案例,这里第一层搞了,但是第二层还没搞,我们把深度搞成3
内部的二级函数也被解释了,这个基本在线的工具都不给设置这个参数,也不知道是有意的还是故意的?
倒腾到这里后,如果你觉得一些参数看起来还是很痛苦,那就让chatgpt-4o帮你将变量和参数调整为易读的方式,并给你下载链接,调整后的结果清晰易懂
是不是想说卧槽!简直是完美还原,我估计原作者都起名起不了那么完美,哈哈!
最后聊聊抽象语法树,如果处理刚才的 stringArraylength,我把整个deob/src打包喂给了4o,并让它看完每个代码,然后再开始与它沟通,的确很吊,找关键代码的速度刚刚的,下面的几个截图可以很好的解释,这个参数,大概就是解密函数会是一个很长的数组,我这里设置的是30个,其实这里多少,你要用人眼来辨识,或者让4o来快速找到,你再让babel/parse解析后,找到数量,设置进去
elements 刚好对应着代码里面这一行,这样就能很好的理解了