前言
本文仅交流破解思路,由于涉及许多人的根本利益问题,拒绝提供任何源代码及成品,不要以任何理由及条件私聊我索要,也拒绝有偿转回js!!有能力的可以自己开发
简介
- auto.js庖丁是一个兼具加密与解密auto.js脚本的APP,能够将auto.js打包加密过的脚本一键解密,同时也能将脚本从js转为dex进行加密,以下简称庖丁
- 从js转为dex之后,rhino没有任何重新读取java字节码转回js的功能,所以只能另辟蹊径
- 由于编译之后,很多不兼容java的表达式都使用了等价的表达式进行替换,所以不可能完全与源码一致
所需工具
- jadx
- IntelliJ IDEA等任一java编辑器
- javaparser.jar
过程
了解加密后的dex
使用jadx将dex反编译为java,由于rhino编译时全部使用模板语法,基本不会有无法解析的内容
查看java代码
可以看到方法名和字符串都被都被加密过了,不解密基本是没法操作的
了解java方法含义
里面还有各种各样的对js语法进行描述的方法,我们可以知道,这些java方法描述了js每条语句的构成,毕竟我们不是rhino作者,我们并不清楚每个java方法对应于js的语法描述,所以我们需要一个代码较多的js源码进行对照
由此我们可以了解到
- new 类名(scriptable, context, 数字) 是对一个函数的引用,同时最后的数字是与方法名结尾的数字是一一对应的
- _c_script_0是js代码的根节点
- objArr是参数数组,但是有时候会被中间变量中转
- js中的变量在java中往往是Scriptable、Callable、Object三种形式
- getFunctionName、getParamAndVarCount、getParamCount、getParamOrVarName四个方法中,分别存储了函数名、参数及变量的数量、参数的数量、参数及变量的名称
解析java为语法树
使用javaparser将java代码解析为一颗语法树,我们需要通过不断地修剪这颗语法树,才能使其接近js语法,然后再进行字符串的修饰
修剪语法树
1、将所有的字符串和方法名全部解密替换
2、清理掉所有无实际意义的节点
3、设定一个解析java方法的类,进行统一解析并返回等价的结果
4、解析每个java方法,替换为对应的表达式,替换掉原来的节点
5、解析携带函数名、函数参数名、变量名的switch节点,提取所有的名称信息
6、将参数名与变量名对应的变量名称替换为真正的名称
7、从_c_script_0开始,递归查找对应的函数引用,将其打包为function形式,同时添加参数名,拼接到原来的位置,最后的_c_script_0方法语句块就携带了原本js的所有信息
修饰字符串
由于某些语法的不兼容性,我使用了eval方法将不兼容的语句打包为字符串,将最后的根语句块生成代码字符串之后,我们再将对应的eval代码展开,即可得到与源代码等价的js代码
逆编译结果
结束语
- 由于rhino中对js语法描述的java方法基数极大,除了rhino作者,估计没人能一次性完成对所有方法的解析,只能在不断地修bug中完善,目前我也不能完成对所有js编译后的dex完美转回js
- 虽然说着原理很简单,但是实际做起来难度很大,会很头疼,踩各种的坑
- javaparser没有文档对所有的方法做说明,一切需要自己去尝试,之前没用过的人这一步就要卡很久,包括我自己
|