资讯动态

KernelSU 隐藏功能解析:利用 .ksurc 接管 Root Shell 的 rc 初始化

发布时间:2026/9/13 13:13:34 来源:尧图企业网站定制
KernelSU 隐藏功能解析利用 .ksurc 接管 Root Shell 的 rc 初始化【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU本文围绕 KernelSU 官方文档中隐藏功能Hidden features章节所介绍的.ksurc机制展开默认情况下 Android 的/system/bin/sh会加载系统 rc 文件/system/etc/mkshrc而 KernelSU 允许你通过创建/data/adb/ksu/.ksurc文件让su启动的 Root Shell 改用它来完成初始化。读完本文你将理解该机制的底层实现ksud 与 adbd 两条注入路径并能独立配置、验证与回滚自定义 rc 环境。一、隐藏功能是什么一句话认识 .ksurcKernelSU 的官方文档将.ksurc收录在隐藏功能章节见 website/docs/vi_VN/guide/hidden-features.md英文原文见 website/docs/guide/hidden-features.md核心表述非常简洁默认情况下/system/bin/sh会加载/system/etc/mkshrc你可以通过创建/data/adb/ksu/.ksurc文件让su加载该自定义 rc 文件而不是/system/etc/mkshrc。也就是说.ksurc是 KernelSU 提供的Root Shell 初始化钩子只要该文件存在你通过 KernelSU 获得的 Root Shell 在启动时就会先执行.ksurc中的内容从而自定义别名、环境变量、umask、函数等初始化行为。这在批量管理多台设备、注入统一环境、或为某些脚本预置依赖时非常实用。二、为什么需要它Android sh 的 rc 加载机制要理解.ksurc的价值先要弄清 Android 的默认行为。Android 的系统 Shell/system/bin/shmksh在启动时会参考环境变量ENV所指向的 rc 文件来初始化会话。系统默认把ENV指向/system/etc/mkshrc因此每个交互式 Shell 启动时都会加载系统预置的别名、函数与默认行为。KernelSU 的源码注释直接印证了这一背景manager/app/src/main/cpp/adbroot.cc 中写道 If the user creates ksurc, use ksurc instead of mkshrc并引用了 AOSPpackages/modules/adb/daemon/shell_service.cpp中 adbd 构造 Shell 环境的相关代码。换句话说ENV环境变量是这套机制的开关谁控制了ENV谁就控制了 Shell 启动时加载的 rc 文件。.ksurc正是 KernelSU 注入自定义ENV的产物。三、工作原理解析两条 ENV 注入路径KernelSU 在两条不同的 Root Shell 入口分别注入了ENV/data/adb/ksu/.ksurc对应两种典型使用场景应用/终端请求的su以及 adb root 后的 adb shell。3.1 路径一ksud 的 su 实现su的实际执行逻辑位于 ksud 的 userspace/ksud/src/su.rs。在root_shell()构造目标 Shell 命令时做了如下判断// when KSURC_PATH exists and ENV is not set, set ENV to KSURC_PATH if PathBuf::from(defs::KSURC_PATH).exists() env::var(ENV).is_err() { command.env(ENV, defs::KSURC_PATH); }这里的KSURC_PATH定义在 userspace/ksud/src/defs.rspub const KSURC_PATH: str concatcp!(WORKING_DIR, .ksurc);而WORKING_DIR为/data/adb/ksu/因此最终路径正是/data/adb/ksu/.ksurc。注意这个条件有两个要点文件必须存在只有当.ksurc实际存在于磁盘上时才会注入ENV原环境未设置ENV如果调用方环境中已经显式设置了ENV变量ksud 不会覆盖它env::var(ENV).is_err()为真才注入避免破坏调用方的显式意图。3.2 路径二adbdadb root的 execle 拦截在 adb root 场景下Root Shell 由 adbd 的 shell_service 创建此时 ksud 的 su 逻辑并不参与。为此KernelSU 在管理器原生库中通过拦截execle系统调用来注入ENV见 manager/app/src/main/cpp/adbroot.ccbool ksurc_exists (access(/data/adb/ksu/.ksurc, F_OK) 0); const char *ksu_env_str ENV/data/adb/ksu/.ksurc; ... // skip original ENV in envp if (ksurc_exists strncmp(old_envp[i], ENV, 4) 0) { continue; } ... if (ksurc_exists) { // push our ENV in here!!! env_list.push_back(ksu_env_str); }该 hook 的行为是遍历 adbd 传给execle的原有环境数组如果检测到.ksurc存在就跳过原有的ENV...即系统默认的/system/etc/mkshrc并把ENV/data/adb/ksu/.ksurc追加进去最后通过execve完成真正的执行。这意味着只要开启 adb rootadb shell 的初始化也会被.ksurc接管。由此可见.ksurc的生效范围同时覆盖su 启动的 Shell与adb root 的 Shell两条路径殊途同归。四、实战创建并使用 .ksurc4.1 创建文件由于/data/adb/ksu是 KernelSU 的工作目录由WORKING_DIR定义只需在其中创建隐藏文件.ksurc即可# 确保目录存在一般随 KernelSU 初始化自动创建 mkdir -p /data/adb/ksu # 创建自定义 rc 文件 touch /data/adb/ksu/.ksurc4.2 写入初始化内容.ksurc的语法与普通 POSIX Shell rc 脚本一致会在 Root Shell 启动时被 mksh 执行。常见用途示例# 自定义别名 alias llls -l alias lals -la # 追加 PATH注意 ksud 已默认把 /data/adb/ksu/bin 加入 PATH见 su.rs 的 add_path_to_env export PATH$PATH:/custom/tools # 设置默认 umask umask 022 # 定义辅助函数 ksuinfo() { echo KernelSU root shell initialized }4.3 验证是否生效创建并写入内容后重新发起一个 Root Shell 会话su或adb root后的adb shell检查# 查看 ENV 变量是否指向 .ksurc echo $ENV # 验证自定义别名/函数是否可用 type ll ksuinfo如果ENV输出为/data/adb/ksu/.ksurc且自定义内容可用说明注入成功。4.4 回滚到默认行为不需要该功能时删除文件即可恢复默认加载/system/etc/mkshrcrm /data/adb/ksu/.ksurc五、优先级与边界条件结合源码可以梳理出以下边界行为避免踩坑文件存在性优先ksud 与 adbd 两条路径都以access(...F_OK)/PathBuf::exists()判断文件是否存在不存在则完全不注入ENV回到系统默认行为显式ENV不覆盖su 路径调用方环境已设置ENV时ksud 保留原值见 su.rs因此某些显式指定 rc 的调用方行为不会被.ksurc劫持adbd 路径强制替换adbroot 的 execle hook 会跳过旧ENV并注入新值见 adbroot.cc注释中说明这是为了防御新版 Android 或定制 ROM 对ENV的改动-ppreserve-environment选项su -p仅影响HOME/USER/LOGNAME/SHELL等变量的重建.ksurc的ENV注入独立于该选项执行不受影响。六、相关机制与延伸.ksurc属于用户空间的 Shell 初始化钩子内核侧 KernelSU 还提供了另一套 rc 机制用于模块初始化modules.rc二者职责不同但理念相通。内核模块参数norcksu_no_custom_rc定义于 kernel/core/init.c在 kernel/runtime/ksud_integration.c 的load_module_rc_once()中被检查用于在内核侧禁用模块 rc 的加载。若你希望对自定义 rc 有更严格的管控可关注这一内核参数的用途它约束的是模块 rc而非.ksurc本身。另外ksud 在启动 Root Shell 时还会默认把/data/adb/ksu/bin追加进PATH见 su.rs 与 adbroot.cc这与.ksurc配合可以让 Root Shell 开箱即用地访问 KernelSU 自带的命令行工具。总结.ksurc是 KernelSU 提供的一个小而精的隐藏功能只需在/data/adb/ksu/.ksurc创建 rc 脚本就能让su与 adb root 的 Shell 放弃默认的/system/etc/mkshrc转而加载你的自定义初始化环境。其底层实现清晰可循——ksud 侧通过设置ENV环境变量注入su.rsadbd 侧通过拦截execle注入adbroot.cc。掌握这一机制你就多了一个统一管理 Root 终端环境的轻量手段。【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价