一:修改系统文件
需要修改一些系统文件,以允许adbd进程在root用户下运行,并关闭Verity检查。我们需要修改以下文件:
1.frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
这个文件负责创建应用程序进程,并设置它们的权限和能力。需要注释掉DropCapabilitiesBoundingSet函数中的代码,以防止它删除adbd进程的任何能力。
@@ -658,7 +658,7 @@ static void EnableKeepCapabilities(fail_fn_t fail_fn) {}static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) {
- for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {;
+ /*for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {;if (prctl(PR_CAPBSET_DROP, i, 0, 0, 0) == -1) {if (errno == EINVAL) {ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify "
@@ -667,7 +667,7 @@ static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) {fail_fn(CREATE_ERROR("prctl(PR_CAPBSET_DROP, %d) failed: %s", i, strerror(errno)));}}
- }
+ }*/}
2. packages/modules/adb/Android.bp
这个文件定义了adbd模块的编译选项和依赖项。需要添加-DALLOW_ADBD_ROOT=1到cflags中,以启用adbd进程的root模式,并添加remount到required中,以允许adbd进程重新挂载系统分区。
@@ -50,6 +50,7 @@ cc_defaults {"-Wvla","-DADB_HOST=1", // overridden by adbd_defaults"-DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION=1",
+ "-DALLOW_ADBD_ROOT=1",],cpp_std: "experimental",@@ -111,8 +112,15 @@ cc_defaults {cc_defaults {name: "adbd_defaults",defaults: ["adb_defaults"],
+ cflags: [
+ "-UADB_HOST",
+ "-DADB_HOST=0",
+ "-UALLOW_ADBD_ROOT",
+ "-DALLOW_ADBD_ROOT=1",
+ "-DALLOW_ADBD_DISABLE_VERITY",
+ "-DALLOW_ADBD_NO_AUTH",
+],- cflags: ["-UADB_HOST", "-DADB_HOST=0"],}cc_defaults {
@@ -605,7 +613,7 @@ cc_library {"libcrypto","liblog",],
-
+ required: [ "remount",],target: {android: {srcs: [
3. packages/modules/adb/daemon/main.cpp
这个文件是adbd进程的主要入口点。我们需要修改should_drop_privileges函数,让它总是返回false,以防止它降低adbd进程的权限。
@@ -64,6 +64,7 @@static const char* root_seclabel = nullptr;static bool should_drop_privileges() {
+ return false;// The properties that affect `adb root` and `adb unroot` are ro.secure and// ro.debuggable. In this context the names don't make the expected behavior// particularly obvious.
4. system/core/fs_mgr/Android.bp
这个文件定义了fs_mgr模块的编译选项和依赖项。fs_mgr模块负责管理设备上的文件系统。我们需要修改-DALLOW_ADBD_DISABLE_VERITY=0为-DALLOW_ADBD_DISABLE_VERITY=1,以允许adbd进程关闭Verity检查。
@@ -237,7 +237,8 @@ cc_binary {"fs_mgr_remount.cpp",],cppflags: [
- "-DALLOW_ADBD_DISABLE_VERITY=0",
+ "-UALLOW_ADBD_DISABLE_VERITY",
+ "-DALLOW_ADBD_DISABLE_VERITY=1",],product_variables: {debuggable: {
5. system/core/init/Android.bp
这个文件定义了init模块的编译选项和依赖项。init模块是设备启动时运行的第一个进程,负责初始化系统服务和属性。我们需要修改以下几个选项:(其实没什么卵关系,顺手改了下)
-DALLOW_FIRST_STAGE_CONSOLE=1:允许init进程在第一阶段打开控制台输出-DALLOW_LOCAL_PROP_OVERRIDE=1:允许init进程覆盖本地属性-DALLOW_PERMISSIVE_SELINUX=1:允许init进程设置SELinux为permissive模式-DREBOOT_BOOTLOADER_ON_PANIC=1:允许init进程在发生内核崩溃时重启到bootloader模式-DWORLD_WRITABLE_KMSG=1:允许init进程设置kmsg文件为可写-DDUMP_ON_UMOUNT_FAILURE=1:允许init进程在卸载分区失败时生成内存转储-DSHUTDOWN_ZERO_TIMEOUT=1:允许init进程在收到关机命令时立即执行
@@ -113,13 +113,13 @@ libinit_cc_defaults {"-Wno-unused-parameter","-Werror","-Wthread-safety",
- "-DALLOW_FIRST_STAGE_CONSOLE=0",
- "-DALLOW_LOCAL_PROP_OVERRIDE=0",
- "-DALLOW_PERMISSIVE_SELINUX=0",
- "-DREBOOT_BOOTLOADER_ON_PANIC=0",
- "-DWORLD_WRITABLE_KMSG=0",
- "-DDUMP_ON_UMOUNT_FAILURE=0",
- "-DSHUTDOWN_ZERO_TIMEOUT=0",
+ "-DALLOW_FIRST_STAGE_CONSOLE=1",
+ "-DALLOW_LOCAL_PROP_OVERRIDE=1",
+ "-DALLOW_PERMISSIVE_SELINUX=1",
+ "-DREBOOT_BOOTLOADER_ON_PANIC=1",
+ "-DWORLD_WRITABLE_KMSG=1",
+ "-DDUMP_ON_UMOUNT_FAILURE=1",
+ "-DSHUTDOWN_ZERO_TIMEOUT=1","-DINIT_FULL_SOURCES","-DINSTALL_DEBUG_POLICY_TO_SYSTEM_EXT=0",],
步骤二:修改内核代码
接下来,需要修改一些内核代码,以允许adbd进程修改系统的能力集,以及关闭SELinux的强制执行。我们需要修改以下文件:
1. kernel-5.10/security/commoncap.c
这个文件实现了一些通用的能力操作函数。我们需要注释掉cap_prctl_drop函数中的代码,以防止它检查adbd进程是否有CAP_SETPCAP能力,以及是否传递了一个有效的能力参数。
@@ -1163,11 +1163,11 @@ static int cap_prctl_drop(unsigned long cap){struct cred *new;- if (!ns_capable(current_user_ns(), CAP_SETPCAP))
+/* if (!ns_capable(current_user_ns(), CAP_SETPCAP))return -EPERM;if (!cap_valid(cap))return -EINVAL;
-
+*/new = prepare_creds();if (!new)return -ENOMEM;
2. system/core/init/selinux.cpp
这个文件实现了一些与SELinux相关的函数。我们需要修改IsEnforcing函数,让它总是返回false,以防止它检查系统属性或内核参数是否设置了SELinux的强制执行。
@@ -102,6 +102,7 @@ namespace {enum EnforcingStatus { SELINUX_PERMISSIVE, SELINUX_ENFORCING };+/*EnforcingStatus StatusFromProperty() {EnforcingStatus status = SELINUX_ENFORCING;@@ -120,13 +121,15 @@ EnforcingStatus StatusFromProperty() {}return status;
-}
+}*/bool IsEnforcing() {
- if (ALLOW_PERMISSIVE_SELINUX) {
+ //add root
+ return false;
+ /*if (ALLOW_PERMISSIVE_SELINUX) {return StatusFromProperty() == SELINUX_ENFORCING;}
- return true;
+ return true;*/}