论autojs庖丁加密破解--自动化逆编译
# 前言本文仅交流破解思路,由于涉及许多人的根本利益问题,拒绝提供任何源代码及成品,**不要以任何理由及条件私聊我索要,也拒绝有偿转回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没有文档对所有的方法做说明,一切需要自己去尝试,之前没用过的人这一步就要卡很久,包括我自己
很多人可能并不知道庖丁是个啥玩意,在这:
Auto.js一键加密解密工具《Auto.js庖丁》更新至Ver2.6版本
https://www.52pojie.cn/thread-1212880-1-1.html
(出处: 吾爱破解论坛)
楼主我有几点疑问,我最近刚入门autojs,以前学过C++,看到代码比较类似。简单学会了一些。问题1是,这些变量的规则及使用方法我在哪学习呢?问题2,目前学会的都是操作性的,是不是也有读取性的变量,比如识别页面中有无图片,或者图形边缘,或者特定符号等识别类变量。谢谢指点! 这个应该很难 我擦大佬 亮瞎了我的👁大佬 看不懂 ,,,,,, 学习学习{:301_998:} 这个有什么实际用途? hxq40 发表于 2020-8-5 15:09
这个有什么实际用途?
写auto.js脚本的自然知道用途多大 学习学习