安卓开机自启动方案
安卓开机自启动方案----基于Magisk
一、需求描述
本文的开机自启动应用场景并非普通的安卓APP启动,主要的目标是在设备启动时执行shell脚本,并使用frida-inject进行frida脚本注入动作。在通常的情况下,开机启动某个app可以通过安卓的广播功能来进行,但是此方式并不能确保成功启动,在锁屏情况下也可能导致失败,并且对于有些国内深度定制的安卓系统是完全无效的。
二、Init.d尝试
起初,由于我们的场景是拥有root权限的,笔者打算通过激活安卓的Init.d来实现需求。大致的流程如下:
安装环境(busybox)-激活init.d-复制shell脚本到指定目录
这套方案在经过一番尝试后被我放弃了,原因如下:
- 部署繁琐,需要安装busybox并激活init.d,这一步骤实现完全自动话有些麻烦,当大规模批量部署时,耗时会大大增加
- 不能够适配所有安卓设备或系统,比如我用的测试机器红米Note3 MIUI9就失败了
三、使用Magisk实现
刷入Magisk,刷入方法可以见此文章,如果不需要xposed功能可以不刷EdXposed,本文中我们只将Magisk用于自启动,所以不需要。
成功刷入Magisk后重启设备,观察Magisk的启动日志,可以发现Magisk在启动的时候会执行 /data/adb/post-fs-data.d
目录下的shell脚本,那么我们只需要将待执行的sh脚本复制到这个目录并给予执行权限即可,这一步骤可以写成adb命令直接在PC端完成(windows下bat,mac、Linux下sh),例如以下代码:
# 推送到设备
adb push caller.sh /data/local/tmp/caller.sh
# 复制脚本到Magisk启动目录
adb shell "su -c 'dd if=/data/local/tmp/caller.sh of=/data/adb/post-fs-data.d/caller.sh' "
# 给予可执行权限
adb shell "su -c 'chmod 777 /data/adb/post-fs-data.d/caller.sh' "
此时,重启设备便能够自动执行caller.sh脚本,附上一张执行了我们脚本的Magisk日志
四、注意事项
1.MIUI的系统限制
可能是出于系统安全考虑,在高版本的MIUI中,系统是不允许直接开启usb安装功能的,必须插入SIM卡然后用移动数据流量激活,这就使得调试以及部署变得异常麻烦。但是如果先把apk文件推送到手机存储,然后手动安装是可以的,因此我们有一个曲线救国的方案,即先用adb推送到存储、然后用pm命令进行安装,具体命令如下:
# 路径根据具体需求修改
adb push 待安装的apk文件 /storage/emulated/0
# 安装
adb shell "su -c 'pm install /storage/emulated/0/待安装的apk文件' "
如果有root权限,可以直接执行这个脚本
2.脚本编写注意
不要直接将耗时的脚本甚至无限循环的脚本(例如监测某app是否存活、如果挂掉就将其拉起的场景)复制到Magisk启动目录,这可能会导致系统卡在Logo界面,例如MIUI的"卡米",如果确实需要开启启动这样的脚本,可以另写一个脚本,然后通过nohup执行原来的脚本,例如需要执行无限循环的A脚本,可以编写B脚本,B脚本的内容为 nohup sh A.sh >/dev/null 2>&1 &
,然后将B脚本复制到Magisk启动目录即可。
不过如果不慎将无限循环的脚本复制到启动目录导致系统进不去,也不用慌,进Recovery(刷Magisk前肯定是先刷了第三方Recovery的,例如Twrp),利用Twrp的文件管理将启动目录下的脚本删除即可。