• Android系统 修改源码实现root


    适用于所有Android版本(userdebug和user版本)


    1.关闭selinux

    源码路径:system/core

    diff --git a/init/selinux.cpp b/init/selinux.cpp
    index 5a0255acd..787917274 100644
    --- a/init/selinux.cpp
    +++ b/init/selinux.cpp
    @@ -104,6 +104,8 @@ EnforcingStatus StatusFromCmdline() {
    }
    
    bool IsEnforcing() {
    +    return false;
    +
        if (ALLOW_PERMISSIVE_SELINUX) {
            return StatusFromCmdline() == SELINUX_ENFORCING;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.修改su.cpp,注释用户组权限检测

    源码路径:system/extras/

    diff --git a/su/su.cpp b/su/su.cpp
    index 1a1ab6bf..af3d2a68 100644
    --- a/su/su.cpp
    +++ b/su/su.cpp
    @@ -80,8 +80,8 @@ void extract_uidgids(const char* uidgids, uid_t* uid, gid_t* gid, gid_t* gids, i
    }
    int main(int argc, char** argv) {
    -    uid_t current_uid = getuid();
    -    if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");
    +    //uid_t current_uid = getuid();
    +    //if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");
         // Handle -h and --help.
         ++argv;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.给su文件默认授予root权限

    1. 源码路径:system/core
    cd system/core
    diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp
    index 5805a4d19..92e93e76f 100644
    --- a/libcutils/fs_config.cpp
    +++ b/libcutils/fs_config.cpp
    @@ -86,7 +86,7 @@ static const struct fs_path_config android_dirs[] = {
         { 00751, AID_ROOT,         AID_SHELL,        0, "system/bin" },
         { 00755, AID_ROOT,         AID_ROOT,         0, "system/etc/ppp" },
         { 00755, AID_ROOT,         AID_SHELL,        0, "system/vendor" },
    -    { 00750, AID_ROOT,         AID_SHELL,        0, "system/xbin" },
    +    { 00755, AID_ROOT,         AID_SHELL,        0, "system/xbin" },
         { 00751, AID_ROOT,         AID_SHELL,        0, "system/apex/*/bin" },
         { 00751, AID_ROOT,         AID_SHELL,        0, "system_ext/bin" },
         { 00751, AID_ROOT,         AID_SHELL,        0, "system_ext/apex/*/bin" },
    @@ -190,7 +190,7 @@ static const struct fs_path_config android_files[] = {
         // the following two files are INTENTIONALLY set-uid, but they
         // are NOT included on user builds.
         { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/procmem" },
    -    { 04750, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
    +    { 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 源码路径:frameworks/base
    diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
    index 9eede83e21e5..694eec2a40ac 100644
    --- a/core/jni/com_android_internal_os_Zygote.cpp
    +++ b/core/jni/com_android_internal_os_Zygote.cpp
    @@ -656,6 +656,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++) {;
         if (prctl(PR_CAPBSET_DROP, i, 0, 0, 0) == -1) {
           if (errno == EINVAL) {
    @@ -666,6 +667,7 @@ static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) {
           }
         }
       }
    +  */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 源码路径:kernel/
      andriod12的目录是kernel-5.10或者kernel-4.19
    diff --git a/security/commoncap.c b/security/commoncap.c
    index f86557a8e43f6..19124dd6239a1 100644
    --- a/security/commoncap.c
    +++ b/security/commoncap.c
    @@ -1147,12 +1147,12 @@ int cap_task_setnice(struct task_struct *p, int nice)
    static int cap_prctl_drop(unsigned long cap)
    {
            struct cred *new;
    
    +/*
            if (!ns_capable(current_user_ns(), CAP_SETPCAP))
                    return -EPERM;
            if (!cap_valid(cap))
                    return -EINVAL;
    +*/
    
            new = prepare_creds();
            if (!new)
                    return -ENOMEM;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4.user版本需要把su编进系统

    源码路径:build/core(Android13及之后版本的路径是 build/make)

    diff --git a/target/product/base_system.mk b/target/product/base_system.mk
    index 4569bceff9..5c8eaaa87c 100644
    --- a/target/product/base_system.mk
    +++ b/target/product/base_system.mk
    @@ -273,6 +273,7 @@ PRODUCT_PACKAGES += \
         wificond \
         wifi.rc \
         wm \
    +    su \
    # VINTF data for system image
    PRODUCT_PACKAGES += \
    @@ -378,7 +379,6 @@ PRODUCT_PACKAGES_DEBUG := \
         ss \
         start_with_lockagent \
         strace \
    -    su \
         sanitizer-status \
         tracepath \
         tracepath6 \
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    Golang 的锁机制
    计算机组成原理——总线(课程笔记)
    MySQL Joins 学习笔记
    Python中Write和Writelines有什么区别?
    【C# 7.0 in a Nutshell】第3章 在C#中创建类型——类
    实名认证在文旅出行行业的应用场景有哪些?
    针对海洋数据的管理三维gis软件系统有何优势
    自动私信引流软件的运行分享,与开发需要到的技术分析
    Android修行手册 - 阴影效果的几种实现以及一些特别注意点
    【数通 | BGP】BGP的基本概念和工作原理
  • 原文地址:https://blog.csdn.net/weixin_45639314/article/details/133888624