上手记录(一)
NeoDesktop 依赖 Shizuku 代码,激活阻塞的问题
实际排查过程中,发现并不是阻塞了,而是报错了
1 |
|
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++ 代码,都可以被提权
这是最魔法的地方,我也正式因为排查问题,才一点一点,弄明白了一点原理