Android13 Root实现和原理分析

简介: Android13 Root实现和原理分析

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功能。但这些修改可能会降低设备的安全性,请在明确了解风险后再搞。

希望这篇博客能对你有所帮助,如果你有任何问题或建议,欢迎留言讨论。谢谢!

相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
4天前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
11 0
|
1月前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
1天前
|
安全 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
在移动应用开发的广阔天地中,Android和iOS两大阵营各据一方。本文将深入探讨这两个操作系统在开发环境、编程语言、用户界面设计及市场分布等方面的主要区别。通过比较分析,我们将揭示各自平台的特有优势,并讨论如何根据目标受众和业务需求选择适合的开发平台。
|
3天前
|
搜索推荐 安全 Android开发
安卓与iOS操作系统的对比分析
在移动设备市场上,安卓和iOS操作系统一直是主要竞争对手。本文将从用户界面、应用生态系统、定制化程度和安全性等方面对安卓和iOS进行对比分析,并探讨两者在不同场景下的适用性。
|
10天前
|
安全 Android开发 iOS开发
安卓与iOS操作系统的比较分析
【6月更文挑战第5天】本文将深入探讨安卓和iOS两大主流操作系统的特点、优势和劣势。通过对比分析,我们将揭示这两个系统在性能、安全性、用户体验等方面的差异,帮助用户更好地了解这两个系统,从而做出更明智的选择。
|
18天前
|
人工智能 vr&ar Android开发
安卓与iOS系统的发展趋势及影响分析
在移动互联网时代,安卓和iOS作为两大主流移动操作系统,在不断发展变化中展现出不同的特点和发展趋势。本文从技术性角度出发,分析了安卓和iOS系统的发展趋势,并探讨了它们对移动设备市场和用户体验的影响,帮助读者更好地理解当前移动操作系统的发展方向和未来可能的变化。
17 0
|
29天前
|
Android开发 异构计算 前端开发
Android显示原理,安卓自定义view面试
Android显示原理,安卓自定义view面试
|
30天前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
1月前
|
Java Linux 调度
Android 打包分析
Android 打包分析
26 2
|
1月前
|
存储 Android开发
android launcher总体分析
android launcher总体分析
21 1