Here's me.

这两天在研究安卓应用如何去冻结其他应用.别跟我说用 adb shell pm disable,慢死了.直接使用 packageManager.setApplicationEnabledSetting() 是不可以的,会抛出可爱的异常. 那么应该怎么做呢,看了一下源码,若有所思. setApplicationEnabledSetting() 方法只允许 UID.SHELL/UID.ROOT 或是 UID.SYSTEM 的应用去调用,如果我们的应用 UID 成为了以上这些不就好了吗?

方法一

我们可以在应用程序的 AndroidManifest.xml 中的 manifest 节点中加入android:sharedUserId="android_.uid.shell" 这个属性, 并使用系统签名,应用的UID即可成为 UID.SHELL.(一些应用的提权模式就是这样做的).但是这样做有一些局限性,比如我们必须使用系统签名,否则会安装不上;这样子做之后会有一些安全问题,在这里就不细讲了.总了个之,不建议这样做.

方法二

app_process 源码 有云: "Usage: app_process [java-options] cmd-dir start-class-name [options]\n" 我们可以通过 app_process 启动一个进程,此进程的 UID 可以是 SHELL/ROOT,满足我们的需要. 简单实践一下: 编写一个简单的 Android 程序,包名 gs.https.shell,类名 shell

public class shell {
  public static void main(String[] args) {
    iPackageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
    iPackageManager.setApplicationEnabledSetting("com.example.hhhh", PackageManager.COMPONENT_ENABLED_STATE_DISABLED,0,0,null);
  }
}
IPackageManager 属于 @hide API,我们需要一些奇技淫巧才可以访问,详情.

运行一下子:

pmpath=pm path gs.https.shell
path=${pmpath:8}
CLASSPATH=$path nohup app_process /system/bin gs.https.shell.shell

发现 com.example.hhhh 已经被冻结.

我们当然可以发现这样直接调用 API 冻结应用比申请 ROOT 然后 pm disable 快得多.因此我们应该多使用 Shizuku Manager , 黑阈 , 小黑屋等直接调用 API 的应用,毕竟更快嘛

标签: 特权api

仅有一条评论

  1. zsh2401 zsh2401

    写得不错

添加新评论