共计 5227 个字符,预计需要花费 14 分钟才能阅读完成。
Auto.js:能在手机没有 ROOT 的情况下,制作各种运行于安卓的自动化脚本,类似手机按键精灵。
公众号中发送:AI 小子,将获得一个 AI 学习大礼包的推送。
项目仓库地址:
码云:
https://gitee.com/liuliuzhu/A…
Github:
https://github.com/66pig/Auto…
apk 下载(Github):
https://github.com/66pig/Auto…
今天要干啥?
看到好用的 Auto.js 脚本,咱想瞅瞅这东西是咋写的,咋办?
干他!兄弟们上!!奥利给!!!
什么是 Auto.js
有啥特点?
- 无需 root:基于无障碍服务;
- 基于控件:以坐标为基础的按键精灵、脚本精灵很容易出现分辨率问题,而以控件为基础的 Auto.js 则没有这个问题;
- 上手简单:使用 javascript 编写,支持中文变量名;
- 可打包:可以将 JavaScript 打包为 apk 文件;
- 其他:结合 Tasker、自动布局分析、生成简单代码等功能,详见官方文档。
都能干些啥?
替代用户做一些手机操作,比如以下脚本:
- 一键收集蚂蚁森林能量
- 微信跳一跳脚本
- 支付宝星星球脚本
- 手机屏幕取色器
- 百度贴吧一键签到
- 东方头条、趣头条自动刷金币
- 超星尔雅学习刷课脚本
- 王者荣耀刷金币
- 红包雨
- ……
准备工具
Python 环境、Enjarify、Apktool、JD-GUI、测试 APP、AndroidStudio、Xposed(可以使用免 ROOT 的 VirtualXposed)
以上软件我已经给大家准备好了:
工具下载地址:
https://pan.baidu.com/s/1t6TH… 密码:y6w0
若连接失效,请在公众号聊天界面发送关键词:Autojs 逆向
Apktool 查看目标 APP 资源文件
Apktool 下载地址:
https://ibotpeaches.github.io…
第一步:下载所需的 2 个文件, 一个 jar 和一个脚本, 注意正确的保存方式是这样的:
正确的姿势
提示:下载下来的 jar 文件后面有版本号,需要手动去掉,请保持名字与上图一致
第二步:给 apktool 脚本赋予可执行权限:
$ chmod a+x apktool
运行 apktool 脚本,检查是否成功:
$ ./apktool
出现如图所示关于 apktool 参数的说明,表示成功了
第三步:开始对咱们的测试 APP 下手
1. 将测试 APP 放到当前文件夹中
2. 执行命令
$ ./apktool d 点赞狂魔_v1.2.0.apk -o result
或者不用 apktool 脚本,直接用 apktool.jar
$ java -jar apktool.jar d 点赞狂魔_v1.2.0.apk -o result
3. 执行成功后,会在当前文件夹中生成一个名为 result 的资源文件
4. 用编辑器打开 AndroidManifest.xml 文件,分析一下 Activity
经过统计,一共有 6 个 Activity,从名字上基本就能确定他们的作用,而小子要做的脚本源码分析一定是与 ScriptExecuteActivity 这个 Activity 有关:
# 1 : LogActivity -> 日志相关
# 2 : SplashActivity -> 启动页相关
# 3 : SettingsActivity -> 设置相关
# 4 : ScriptExecuteActivity -> 脚本执行相关
# 5 : PermissionRequestActivity -> 权限许可相关
# 6 : ScreenCaptureRequestActivity -> 屏幕截图相关
记住:我们之后需要从 ScriptExecuteActivity 这个文件入手进行分析
Enjarify 生成 Java 字节码
Enjarify 下载地址:https://github.com/google/enj…
—— 来自 Google 推荐
将 点赞狂魔_v1.2.0.apk(小子的测试 APP)放到 enjarify 项目中,并在当前目录下执行以下命令:
$ python3 -O -m enjarify.main 点赞狂魔_v1.2.0.apk
命令执行成功,会在当前文件夹中生成一个名字为 [测试 APP 名字]-enjarify.jar 的文件
JD-GUI 的使用
将生成的 jar 文件(点赞狂魔_v1.2.0-enjarify.jar)直接拖拽到 JD-GUI 中打开:
导入 jar 后的 JD-GUI 界面
通过搜索定位到 ScriptExecuteActivity.class,并 open
在 ScriptExecuteActivity.class 中找了一圈,并未发现任何可用的信息,所以只能换一个思路:通过 DDMS 来动态调试 APP 中函数调用流程(栈跟踪法)
DDMS 栈跟踪法
已知:DDMS 在 Android SDK 的 sdk 目录下的 tools 目录中
前提:手机通过 USB 调试模式连接至电脑,或者在电脑中使用模拟器
查询可调试设备名称
$ adb devices
查询到我所连接的调试设备
注意:如果你已通过 USB 连接至电脑,或者已经开启了模拟器,但使用这条命令时却查询不到任何信息,请检查手机是否开启了开发者模式与 USB 调试模式。如果以上操作均没有问题,请通过以下命令重启 adb:
$ adb kill-server # -- 停止 adb 服务
$ adb start-server # -- 开启 adb 服务
确保 adb 服务已经开启且手机能正常连接之后,通过 which 命令找到 adb 的位置(adb 默认在 Android SDK 的 sdk 目录下的 platform-tools 目录中),随之找到 DDMS 的位置
$ which adb
# /Users/xingjiarui/Library/Android/sdk/platform-tools/adb
$ cd /Users/[计算机用户名]/Library/Android/sdk/tools/
在 tools 目录中的 monitor 可执行程序就是打开 DDMS 的入口,直接运行 monitor
./monitor
DDMS 启动界面
主界面
等 LogCat 稳定下来了,清空所有日志
清空后的界面
在调试设备上打开测试 APP:
测试 APP 界面
当测试 APP 完全打开后,全选 LogCat 窗口所有日志文件,并粘贴到编辑器进行分析:
日志获取正确姿势
前面小子已经分析出:启动 测试 APP 后第一个 Activity 界面是 ScriptExecuteActivity,那么可以在日志中查找一下,有没有出现 ScriptExecuteActivity 这个类中的方法,以及在这个 ScriptExecuteActivity 类附近有没有其他类出现
通过搜索,在 ScriptExecuteActivity 这个类调用的过程中执行了一次 XJavaScriptEngine 类中的 execute 方法
打开 JD-GUI 找到 XJavaScriptEngine.execute 一探究竟
XJavaScriptEngine.execute
找到了突破口,小子完全可以直接拦截解密方法的结果即脚本数据源码
advancedEncryptionStandard.decrypt
位置已经确定,接下来开始编写 Xposed 插件进行数据拦截 + 存储
插件编写
对 com.stardust.autojs.engine.encryption.ScriptEncryption.decrypt 方法进行拦截,拿到返回结果即解密数据:
/**
* @author 溜溜猪
* @date 2020/05/23
* @desc 微信公众号:AI 小子
*/
public class Hook extends Application implements IXposedHookLoadPackage, Config {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
final Class<?> clazz = XposedHelpers.findClass(
"com.stardust.autojs.engine.encryption.ScriptEncryption",
loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(
clazz,
"decrypt",
byte[].class,
int.class,
int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 获取到的解密数据
String str = HookUtils.bytesToString((byte[]) param.getResult());
HookUtils.strToFile(str, FILEPATH);
}
});
}
}
由于拿到的解密结果为字节数组,无法正常使用,所以,特意写了一个 HookUtils 工具类,来处理返回结果:
/**
* @author 溜溜猪
* @date 2020/05/23
* @desc 微信公众号:AI 小子
*/
public abstract class HookUtils {
/**
* 将字节数组转为字符串
* @param bs: 字节数组
* @return
*/
public static String bytesToString(byte[] bs) {
try {
// 通过指定的字符集解码指定的 byte 数组并构造一个新的字符串
return new String(bs, "utf-8");
} catch (UnsupportedEncodingException e) {e.printStackTrace();
}
return null;
}
/**
* 将字符串写入文件并保存
* @param data: 脚本数据文件
*/
public static void strToFile(String data, String filePath) {String path = filePath.substring(0, filePath.lastIndexOf("/"));
File destDir = new File(path);
if (!destDir.exists()) {destDir.mkdirs();
}
FileWriter fwriter = null;
try {fwriter = new FileWriter(filePath);
fwriter.write(data);
} catch (IOException ex) {ex.printStackTrace();
Log.d("溜溜猪提示", ex.toString());
} finally {if (fwriter != null)
try {fwriter.flush();
fwriter.close();
Log.d("溜溜猪提示", "保存路径为:" + filePath);
} catch (IOException ex) {ex.printStackTrace();
}
}
}
}
最后再处理一下 UI 界面,打包输出:
输出的软件界面
使用方法
第一步:在手机中安装以下软件:
- VirtualXposed
- Auto.js 脚本提取器
- 测试软件(Auto.js 打包出来的软件)
< 点赞狂魔 > 就是小子准备的测试软件
第二步:打开 VirtualXposed,并将 Auto.js 脚本提取器与点赞狂魔克隆进去(或者直接安装进去)
VirtualXposed 是什么?
它的工作原理,有点像那些双开软件。你可以这么理解:它会在我们的手机里生成了一个「虚拟环境」,然后在这个环境中启用 Xposed。一切都是虚拟的,所以叫它做 VirtualXposed
第三步:在 VirtualXposed 中打开 Xposed Installer 软件,并开启 Auto.js 脚本提取器模块
正确的开启姿势:勾选中需要打开的模块
第四步:重启 VirtualXposed 软件,并打开测试软件 < 点赞狂魔 >,等测试软件完全开启后,退出 VirtualXposed,回到真机环境,打开 Auto.js 脚本提取器。如果以上操作步骤没有问题,此刻便可看见提取出来的脚本文件的路径,已经显示出来了
接下来就可以直接对脚本文件进行编辑或分享了,也可以直接导入 Auto.js 软件
选择打开方式
正确打开姿势
注意:要想直接通过软件中的按钮打开脚本文件或者分享脚本文件,一定要在手机真实环境中打开 Auto.js 脚本提取器方可操作,因为虚拟环境中通常没有可以用来打开脚本文件的应用,如果想要在虚拟环境中打开,就需要安装一些必要的编辑器。如果想要在虚拟环境中分享,就需要安装一些必要的社交应用
补充说明
文章仅用于交流软件的安全知识,切勿将技术用于非法用途。若读者因此做出危害他人软件安全的行为后果自负,与平台以及原作者无关,特此声明!
如果想跟小子一起探索人工智能的奥秘
请长按下方二维码关注我吧