上手记录(一)

NeoDesktop 依赖 Shizuku 代码,激活阻塞的问题

实际排查过程中,发现并不是阻塞了,而是报错了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

public static void register(ShizukuService shizukuService) {
sShizukuService = shizukuService;
LOGGER.i("register");
try {
LOGGER.i("invoke ActivityManagerApis.registerProcessObserver");
ActivityManagerApis.registerProcessObserver(new ProcessObserver());
LOGGER.i("invoke ActivityManagerApis.registerProcessObserver done");
} catch (Throwable tr) {
LOGGER.e(tr, "registerProcessObserver");
}

LOGGER.i("invoke ActivityManagerApis.registerProcessObserver done1");
if (Build.VERSION.SDK_INT >= 26) {
LOGGER.i("invoke ActivityManagerApis.registerProcessObserver done1.1");
LOGGER.i("invoke ActivityManagerApis.registerProcessObserver done1.1.2");
int flags = UID_OBSERVER_GONE | UID_OBSERVER_IDLE | UID_OBSERVER_ACTIVE;
LOGGER.i("invoke ActivityManagerApis.registerProcessObserver done2");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
flags |= UID_OBSERVER_CACHED;
}
try {
LOGGER.i("invoke ActivityManagerApis.registerUidObserver");
ActivityManagerApis.registerUidObserver(new UidObserver(), flags,
ActivityManagerHidden.PROCESS_STATE_UNKNOWN,
null);
LOGGER.i("invoke ActivityManagerApis.registerUidObserver done");
} catch (Throwable tr) {
LOGGER.e(tr, "registerUidObserver");
}
}
}

int flags = UID_OBSERVER_GONE | UID_OBSERVER_IDLE | UID_OBSERVER_ACTIVE;

这行代码就报错,原因是因为没有在 Android 工程中

subprojects {
plugins.withId(‘com.android.base’) {
plugins.apply(‘dev.rikka.tools.refine’)

    android {
        compileSdk = 33
        defaultConfig {
            minSdk = 23
            targetSdk = 33
        }
        compileOptions {
            sourceCompatibility = JavaVersion.VERSION_17
            targetCompatibility = JavaVersion.VERSION_17
        }
        buildFeatures {
            aidl true
        }
    }
}

}

Shizuku 介绍

在我个人的认知,需要解释 Shizuku 这个东西,需要从 root 的原理开始

在 Android 上,执行 su 命令并不是切换了当前的 uid,而是打开了一个阻塞的进程,新的进程是 root 权限,然后读取用户的输入,再将输入传递到 su 的子进程中

这样会比较慢,并且,一切的权限都只能提升命令行

而 Shizuku 的诞生,让 root 或者 adb 权限直接提升 Android 的代码变成了可能,这就是 Shizuku 所干的事

并且它的速度会比传统的 su 命令会更快

但经过比较大量的使用和集成,发现里面的魔法远比我想象的多

基础使用

导包

def shizuku_version = (the version above)
implementation “dev.rikka.shizuku:api:$shizuku_version”

// Add this line if you want to support Shizuku
implementation “dev.rikka.shizuku:provider:$shizuku_version”

这些都没什么说的,都是一些简单的操作,但是我并不准备从 demo 开始介绍它的魔法所在

因为 demo 本身的一些设计,让你很难找到其中关键的魔法代码

更魔法的 UserService 模式

在这种模式下,你的任何代码,不仅仅是获取某些 Services,甚至 C/C++ 代码,都可以被提权

这是最魔法的地方,我也正式因为排查问题,才一点一点,弄明白了一点原理

激活程序所干的事

作者

梦魇兽

发布于

2025-04-10

更新于

2025-04-11

许可协议

评论