使用xposed跳过oppo USB安装应用确认

昨天 root 了 reno3,今天就把这个烦人的 usb 安装框给干掉。

代码链接:https://gist.github.com/LeadroyaL/cc1ec2fe8c0818da2436818f1e8dc122

# 背景

众所周知,oppo对安卓开发者非常不友好,每次 adb install 安装APP都要登录账户输入密码,费时费力,如图所示。

昨天刚 root 了一台 reno3,在拥有 root 权限、安装好 xpsoed 后,我们就可以把这个框给干掉了。

如图所示:

# 第一步,观察现象

  • – AndroidStudio 安装 app,弹框输密码;
  • – AndroidStudio 更新 app,可以正常更新;
  • – shell 用户安装 app,弹框输密码;
  • – shell 用户更新 app,可以正常更新;
  • – root 用户安装 app,直接成功;

弹框的Activity 是:

,我们从这里追。

# 第二步,分析 com.android.packageinstaller

com.android.packageinstaller 拖下来,阅读manifest,发现一个和 adb 相关的receiver。

看起来这三个和我们有关

使用 frida 把日志开关打开,

有如下日志:

可以得到信息:

adb install 后并没有直接开启 OppoPackageInstallerActivity,而是

  1. 先收到广播;
  2. 再启动 PackageInstallerActivity,
  3. 再启动 OppoPackageInstallerActivity。

这时候有思路,就是收到广播后别开 Activity 了,直接安装不好吗。。。考虑到两个问题,一是回调问题,我不知道这样做 adb install 是否能感知到安装完毕;二是实现问题,我懒得写代码。

观察 root 用户 pm install 的现象,发现一句日志都没有,也没有发广播,说明根本没有走到这里,这正是我需要的功能。

既然root 能做到,我们应该也可以做到,继续追吧。

# 第三步,分析 framework

根据目前表现来看,oppo 肯定是修改了 framework 的,所以要从 pm install 出发追代码,先把 /system/framework 都拖回来。

先找找 pm 在哪实现的,网上说它代码是在 jar 里的,

搜字符串,

找到 services.jar ,阅读代码,大致如下:

  1. 解析命令
  2. runInstall 简单处理
  3. 子函数里访问远程的 IPackageManager,追不到了

代码都在 com.android.server.pm.PackageManagerShellCommand

 

既然涉及到 IPackageManager,一眼没找到,懒得继续看了,搜别的吧。

我们注意到那个 adb 的广播叫 oppo.intent.action.OPPO_INSTALL_FROM_ADB,肯定很少见,搜:

找到 coloros-services.jar 阅读代码,com.android.server.pm.ColorPackageInstallInterceptManager

注意那几句日志,Slog.d,它们是可以在 logcat 里被看到的,因此去日志看看。

shell 安装,弹框,点击取消按钮

root 安装
无日志

shell 替换安装

 

显然,hook 掉 allowInterceptAdbInstallInInstallStage 返回false就可以了,写个 xposed 插件,测试,收工!

# 第四步:编写 xposed 插件

这里主要考虑如何过滤包名,system_server的包名(可能)是 android,过滤一下就行了。

舒服,再也不用看到这个傻逼的框了。


=============================================================
随着访客的增多,LeadroyaL在本站流量的开支越来越多了,曾经1元能用1个月,现在1元只能用3天。如果觉得本文帮到了你,希望能够为服务器的流量稍微打赏一点,谢谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code