Android 源码修改,使第三方应用可以直接使用su命令

这篇具有很好参考价值的文章主要介绍了Android 源码修改,使第三方应用可以直接使用su命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    在android原生系统中,只有root权限和shell权限下才可以使用su命令,虽然在userdebug模式下编译的系统镜像有自带的su文件,但是第三方应用却无法使用。于是在这种场景下,有两种方式可以实现第三方应用使用su命令。

    1.修改原来的su相关的源码(所有的应用都可以使用)

    2.通过supersu.apk 的方式进行实现(可以通过supersu进行控制应用是否可以使用su)

一、修改原来的su相关的源码
1.修改 system/extras/su/su.c ,屏蔽如下代码:

修改前
 

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");


将su文件中的判断是否是root,或是shell的用户id判断进行注释。

2.修改 system/core/libcutils/fs_config.c, 做如下修改:

修改 fs_path_config android_files结构体中的
 
修改前
 

{ 04750, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },


 
修改后
 

{ 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },


修改su文件的访问权限,将其他用户的权限修改为可读,可执行权限。

3.修改 frameworks/base/cmds/app_process/app_main.cpp,做如下的修改:

注释 main 函数中的以下代码
 
修改前
 

if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
        // Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
        // EINVAL. Don't die on such kernels.
        if (errno != EINVAL) {
            LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
            return 12;
        }
 }


 
修改后
 

/* if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
        // Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
        // EINVAL. Don't die on such kernels.
        if (errno != EINVAL) {
            LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
            return 12;
        }
    } */

4、修改 frameworks/base/core/jni/com_android_internal_os_Zygote.cpp,做如下的修改:

注释 DropCapabilitiesBoundingSet 中的如下代码
 
修改前
 

for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
    int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
    if (rc == -1) {
      if (errno == EINVAL) {
        ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify "
              "your kernel is compiled with file capabilities support");
      } else {
        RuntimeAbort(env, __LINE__, "prctl(PR_CAPBSET_DROP) failed");
      }
    }
  }
 


修改后
 

/* for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
    int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
    if (rc == -1) {
      if (errno == EINVAL) {
        ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify "
              "your kernel is compiled with file capabilities support");
      } else {
        RuntimeAbort(env, __LINE__, "prctl(PR_CAPBSET_DROP) failed");
      }
    }
  } */

注释后就是一个空方法了。

5.修改 system/core/adb/daemon/main.cpp,做如下的修改

将 should_drop_privileges函数 直接返回false
 
修改前
 

static bool should_drop_privileges() {
#if defined(ALLOW_ADBD_ROOT)
    char value[PROPERTY_VALUE_MAX];
 
    // 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.
    //
    // ro.debuggable:
    //   Allowed to become root, but not necessarily the default. Set to 1 on
    //   eng and userdebug builds.
    //
    // ro.secure:
    //   Drop privileges by default. Set to 1 on userdebug and user builds.
    property_get("ro.secure", value, "1");
    bool ro_secure = (strcmp(value, "1") == 0);
 
    property_get("ro.debuggable", value, "");
    bool ro_debuggable = (strcmp(value, "1") == 0);


 
修改后
 

static bool should_drop_privileges() {
    return false;
#if defined(ALLOW_ADBD_ROOT)
    char value[PROPERTY_VALUE_MAX];
 
    // 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.
    //
    // ro.debuggable:
    //   Allowed to become root, but not necessarily the default. Set to 1 on
    //   eng and userdebug builds.
    //
    // ro.secure:
    //   Drop privileges by default. Set to 1 on userdebug and user builds.
    property_get("ro.secure", value, "1");
    bool ro_secure = (strcmp(value, "1") == 0);
 
    property_get("ro.debuggable", value, "");
    bool ro_debuggable = (strcmp(value, "1") == 0);

6、修改 system/core/init/init.cpp,做如下的修改:

将selinux_is_enforcing函数直接返回false
 
修改前
 

static bool selinux_is_enforcing(void)
{
    if (ALLOW_PERMISSIVE_SELINUX) {
        return selinux_status_from_cmdline() == SELINUX_ENFORCING;
    }
    return true;
}


 
修改后
 

static bool selinux_is_enforcing(void)
{
    return false;
    if (ALLOW_PERMISSIVE_SELINUX) {
        return selinux_status_from_cmdline() == SELINUX_ENFORCING;
    }
    return true;
}

7、修改 system/core/init/Android.mk,做如下修改:

修改前
 

init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=0


修改后
 

init_options += -DALLOW_LOCAL_PROP_OVERRIDE=0 -DALLOW_DISABLE_SELINUX=1


8、修改  device/**/aa/init.aa.rc,在文件最后添加如下代码 (在device下,通过grep "init.rc"  ./* -r -n  查找自己设备的 init.设备名.rc文件)

# wtw let other user can use su 
service    superuser /system/xbin/su --daemon
    class super-user
    user root
    oneshot
 
on property:superuser.start=on
    class_start super-user


9、修改 system/core/adb/Android.mk,做如下修改:

找到  # adbd device daemon 位置,注释掉判断。
 
修改前
 

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY=1
LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1
endif


 
修改后
 

# ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
LOCAL_CFLAGS += -DALLOW_ADBD_DISABLE_VERITY=1
LOCAL_CFLAGS += -DALLOW_ADBD_ROOT=1
# endif

10、对源码进行 make clean,再进行编译。生成镜像就可以了。
 文章来源地址https://www.toymoban.com/news/detail-708916.html

到了这里,关于Android 源码修改,使第三方应用可以直接使用su命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编辑视频无需第三方软件,在iPhone上也可以轻松编辑视频

    如果你学会了如何在iPhone上编辑视频,你可以在很大程度上把匆忙拍摄的视频变成适合好莱坞的视频。好吧,也许这有点夸张了,但至少,你可以通过使用照片应用程序中的编辑工具,让你的视频看起来更令人印象深刻。 虽然它不一定能与最好的视频编辑软件相匹配,但它仍

    2024年02月07日
    浏览(44)
  • Maven 配置文件修改及导入第三方jar包

    (D:appapache-maven-3.5.0confsettings.xml,1中环境变量对应的maven包下的conf)

    2024年02月11日
    浏览(49)
  • 查看python第三方库的安装路径并修改路径(二)之Pycharm下如何安装第三方函数库,并明确安装位置

    #第一步:学习如何利用pycharm安装第三方库 如图,打开pycharm的文件–设置。 打开python的编译器,点开+号,即可搜索并下载需要的第三方库,软件会自动默认安装在某个路径,此路径和你当初安装软件的位置有关系。 #第二步:查找第三方库的安装路径 以我为例,我的针对于

    2024年02月14日
    浏览(61)
  • 项目中拖拽元素,可以使用html的draggable属性,当然也可以用第三方插件interact

    html的draggable属性需要自己写逻辑,用人家封装好的代码简单逻辑清楚,非常香 链接: https://blog.csdn.net/vvv3171071/article/details/122705408

    2024年02月08日
    浏览(52)
  • Android Pdf第三方框架

    导入AndroidPdfViewer 在 repositories 里面添加库 布局文件引用PDFView PdfViewer 为我们提供了以下几种读取文件的方法: Configurator 主要方法 PDFView 其他方法 github地址: https://github.com/barteksc/AndroidPdfViewer 导入mupdf 在 repositories 里面添加库 mupdf提供了解析代码, Document 读取pdf文件, Androi

    2024年02月13日
    浏览(66)
  • 微信小程序自定义字体样式、字体修改、第三方字体设置

     博主介绍: 本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮

    2024年02月04日
    浏览(75)
  • Android 解决第三方库版本冲突

    在开发游戏SDK时会使用一些第三方库,例如上文提到的 OkHttp ,或者集成某些第三方,而这些第三方使用的系统库(例如 supportv7)和项目组使用的版本不一致,在编译时就会出现版本冲突问题。解决办法有两个: 尽量不使用第三库,例如针对 OkHttp ,如果没有特殊的需求(比

    2023年04月27日
    浏览(111)
  • Android Studio查看第三方库依赖树

    在Android开发过程中,我们或多或少都会引入第三方库,引入的库越多,越容易产生库之间的依赖冲突,所以我们今天一起来了解Android Studio查看第三方库依赖树。 下面就拿我遇到的问题还原一下: 之前接人容联客服系统的时候,集成完成后进入客服页面发生闪退,我们回顾

    2024年02月08日
    浏览(51)
  • Android Studio引用第三方库的方式

    title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 这里描述的第三方库文件格式指的是 so aar so库介绍一种方法 Aar介绍两种方法 libs目录

    2024年02月08日
    浏览(56)
  • 【Android Studio】第三方库 图表(MPAndroidChart)使用

    项目目录-app-build.gradle 项目目录-app-setting.gradle ​ 该类是图表的控件,类似于按键、图片,是从 xml 文件中通过 id 获取到的。 获取/创建 常用方法 方法名 描述 chart.setDrawBorders( boolean ) 是否显示图表边界,true:显示,默认 false chart.setScaleEnabled( boolean ) 是否使能缩放,true:使

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包