使用xposed跳过小米USB安装应用确认
小米在安装应用时,会弹一个确认的框,十秒后自动点击拒绝,很烦,本文讲一下分析过程和绕过方式。前提条件:已root并可以使用xposed进行hook。
===下文太复杂了,请阅读续集 https://leadroyal.cn/p/1189===
一、背景介绍
之前讲到我有一台红米8A,应用在第一次被安装时,老是弹个确认框,如图所示,看着很难受,root 之后终于有机会干掉它了。
二、研究过程(想看结论的跳过这段)
1、表现和目标
表现:在陌生的包名被安装时,会弹框;在已安装的包名被更新时,不会弹框。
目标:因此通过hook的方式,可以不显示这个Activity。
但这里存在一种可能,已安装的包不会走到这段逻辑,运气比较好,这个Activity是必要的,没走太多弯路。
2、确认分析范围
1 | dumpsys activity top grep ACTIVITY |
3、hook生命周期
表现:陌生包名被安装时,会经历onCreate,等待点击,onDestroy;已安装包名被更新时,会经历onCreate,onDestroy。进而hook绘制 GUI 的函数,发现不弹框时,绘制函数没有被调用。
结论:确实是该Activity控制的,期间会判断包名,从而决定是否绘制弹框。
4、hook点击事件
表现1:点击确认时,会将mResult设置为-1;点击拒绝时,保持mResult为 0;点击后自动finish掉本身。
表现2:onClick里还有疑似统计功能的代码,用hook的方式跳过它们不执行,发现仍然可以正常运行。
结论:是否继续安装与mResult有关,并且在代码中看到大量判断逻辑,共同决定mResult的值。
5、在onDestroy时将mResult修改为-1
结论:此时就算点击拒绝,也会继续安装,说明我们的猜想是正确的。
6、判断包名时走不弹框不绘制的逻辑
判断逻辑如下,尝试hook掉它们的返回值,观测true和false,主动设置,逻辑大致如下: 不考虑混淆的话,hook掉isEnabled就行,测试后按照预期工作。但遇到版本升级,每次都去适配非常麻烦。
7、寻找更稳定的hook点
观察到aze是AdbInstallActivity的一个field,其所在的类必定包含名叫isEnabled的方法,所以就可以反射来找到正确的 hook 点,路径为:AdbInstallActivity.class -> 遍历field所在的class -> 枚举每个class的method -> 找到该Method。
整条路径只依赖AdbInstallActivity 和 isEnabled两个标记,除非混淆策略变掉,否则不会失效。
三、最终成果
贴个gist吧,方便以后更新:https://gist.github.com/LeadroyaL/98d35f526c44d86b379a7099f6f823e6