使用xposed跳过小米USB安装应用确认

小米在安装应用时,会弹一个确认的框,十秒后自动点击拒绝,很烦,本文讲一下分析过程和绕过方式。前提条件:已root并可以使用xposed进行hook。

===下文太复杂了,请阅读续集 https://leadroyal.cn/p/1189===

一、背景介绍

之前讲到我有一台红米8A,应用在第一次被安装时,老是弹个确认框,如图所示,看着很难受,root 之后终于有机会干掉它了。

二、研究过程(想看结论的跳过这段)

1、表现和目标

表现:在陌生的包名被安装时,会弹框;在已安装的包名被更新时,不会弹框。

目标:因此通过hook的方式,可以不显示这个Activity。

但这里存在一种可能,已安装的包不会走到这段逻辑,运气比较好,这个Activity是必要的,没走太多弯路。

2、确认分析范围

1
2
3
dumpsys activity top  grep ACTIVITY

ACTIVITY com.miui.securitycenter/com.miui.permcenter.install.AdbInstallActivity9c60433 pid=15893

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