Android 13算是比较新的(这个patch半年前改的)Android版本,它带来了许多新特性和改进,也增加了一些安全限制,比起之前的版本想让系统拿到root权限变得更加麻烦。如果想在Android 13上拥有完全的控制权,需要修改一些系统文件和内核代码,以绕过SELinux、Verity和其他保护机制。本文将介绍如何在Android 13上实现root功能的一种方法,以及需要修改的文件和代码。
如果你们的设备不过GMS , 随便搞。但注意了 , 如果你们的产品涉及银行 教育可能他们的APP产品用不了!
此方法仅限于调试用。
前提条件
搞机,需要有以下几个条件:
- Android 13源码和设备
- 长得比较帅
- 脑子比较聪明
步骤一:修改系统文件
需要修改一些系统文件,以允许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进程重新挂载系统分区。这个文件好像是Android12以上出来的, adb换到这个目录了
@@ -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检查。这个文件好像是Android12以上出来的, adb换到这个目录了
@@ -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;*/ }
总结
通过以上的修改,我们可以在Android 13上实现root功能。但这些修改可能会降低设备的安全性,请在明确了解风险后再搞。
希望这篇博客能对你有所帮助,如果你有任何问题或建议,欢迎留言讨论。谢谢!