KernelSU 隐藏功能深度解析:利用 .ksurc 定制 su 启动环境

KernelSU 隐藏功能深度解析:利用 .ksurc 定制 su 启动环境 KernelSU 隐藏功能深度解析利用 .ksurc 定制 su 启动环境【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSUKernelSU 内置了一个名为.ksurc的隐藏功能当你在/data/adb/ksu/.ksurc创建自定义 rc 文件后通过su进入的 root shell 将加载该文件而不是 Android 默认的/system/etc/mkshrc。本文以 隱藏功能 文档为主线结合 ksud、libadbroot 与内核 sucompat 的源码实现讲清.ksurc的机制、用法与适用场景读完即可为自己的 root shell 定制别名、环境变量与 PATH。什么是 .ksurc/system/etc/mkshrc是 Android 系统内置 shellmksh的启动配置文件默认情况下/system/bin/sh在启动时会加载它。由于/system/etc位于只读分区普通用户无法修改它来定制 root shell 的启动行为。KernelSU 提供的隐藏功能.ksurc解决了这个问题只要创建/data/adb/ksu/.ksurc文件su就会转而加载该文件而非/system/etc/mkshrc。/data/adb/ksu/目录是 KernelSU 的工作目录包含bin/、lib/、log/、profile/等子目录因此该文件位于可写分区内容完全由用户掌控。背景mkshrc 与 Android shell 的 ENV 机制Android 的/system/bin/sh是 mkshMirBSD Korn Shell。mksh 遵循 POSIX 约定通过ENV环境变量指定交互式 shell 启动时要加载的 rc 文件。系统默认在/system/etc下放置一份全局mkshrc用于初始化 shell 环境。.ksurc的本质就是用 KernelSU 自己的路径覆盖这个默认行为当检测到/data/adb/ksu/.ksurc存在时KernelSU 会在启动 shell 前把环境变量设置为ENV/data/adb/ksu/.ksurc从而让 mksh 加载用户自定义的 rc 文件。使用方法创建 .ksurc在 KernelSU 工作目录下创建文件并写入自定义初始化脚本# 在 root 权限下执行 touch /data/adb/ksu/.ksurc # 编辑内容 vi /data/adb/ksu/.ksurc文件内容就是一段普通的 mksh 脚本可以放置任何你想在每次进入 root shell 时自动执行的内容。例如# 定制 root shell 的提示符 export PS1rootKernelSU:$PWD# # 追加 KernelSU 工具目录到 PATH export PATH$PATH:/data/adb/ksu/bin # 定义常用别名 alias llls -l alias lals -la保存后下次执行su进入 shell 时即自动生效无需重启。生效范围该功能只影响通过 KernelSU 的su进入的 root shell不会改变普通应用的 shell 行为由于su会话中通常会为 root 用户重建HOME、USER、LOGNAME、SHELL等基础环境变量见下文源码分析.ksurc中设置的环境变量在会话内持续有效。源码视角.ksurc 的加载链路.ksurc并非由内核直接读取而是由 KernelSU 用户态组件在启动 shell 前注入ENV环境变量实现的。仓库中存在两条相互独立的加载路径。路径一ksud 的 root_shellsu 命令主路径在 KernelSU 中su命令最终由守护进程 ksud 处理。su.rs 的root_shell函数在exec目标 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存在且环境变量ENV尚未被设置时才会注入ENV/data/adb/ksu/.ksurc。这保证了用户或调用方显式指定的ENV不会被覆盖。KSURC_PATH的常量定义在 defs.rspub const KSURC_PATH: str concatcp!(WORKING_DIR, .ksurc);其中WORKING_DIR为/data/adb/ksu/拼接后即为/data/adb/ksu/.ksurc。此外同一函数还会向 PATH 追加defs::BINARY_DIR即/data/adb/ksu/bin/并优先为目标用户重建HOME、USER、LOGNAME、SHELL环境变量之后再执行command.exec()启动 shellsu.rs。因此在.ksurc里可以安全地引用$HOME等变量。路径二libadbroot 的 execle 拦截adb root 场景当通过adb root获得 root shell 时加载路径位于 adbd 进程内。KernelSU 通过 LD_PRELOAD 注入 libadbroot.so其中 adbroot.cc 拦截了execle系统调用// If the user creates ksurc, use ksurc instead of mkshrc bool ksurc_exists (access(/data/adb/ksu/.ksurc, F_OK) 0); const char *ksu_env_str ENV/data/adb/ksu/.ksurc;实现逻辑为遍历 adbd 传给目标 shell 的完整环境变量列表若.ksurc存在则跳过原有的ENV项注释说明这是为了防御新版 Android 或定制 ROM 自行设置 ENV并追加ENV/data/adb/ksu/.ksurc最后通过execve重新执行adbroot.cc。源码注释同时指向了 AOSP 的shell_service.cpp中 mkshrc 的处理位置印证了默认加载/system/etc/mkshrc的系统行为。路径三内核 sucompat 兼容层在内核侧sucompat.c 负责把对/system/bin/su的execve/faccessat/stat调用重定向到/data/adb/ksudsucompat.c 中的ksu_handle_execve_sucompat_common。也就是说用户执行的su二进制本身并不存在于文件系统而是内核在系统调用层将其“偷换”为 ksud 进程随后由 ksud 的root_shell完成上述ENV注入。/system/bin/su与/system/bin/sh的路径常量定义在 sucompat.c。由此可见.ksurc的完整调用链为内核 sucompat 重定向 su → ksud 执行 root_shell → 检测 .ksurc 并注入 ENV → mksh 加载自定义 rc 文件。典型应用场景统一管理 root shell 环境集中放置export、alias、umask等初始化逻辑替代无法修改的/system/etc/mkshrc扩充 PATH把/data/adb/ksu/bin等自定义工具目录永久加入 PATH避免每次手动输入完整路径美化提示符通过PS1定制 root 提示符便于区分普通 shell 与 root shell按需加载工具在.ksurc中按条件判断如架构、系统版本再导出对应的环境变量实现轻量级差异化配置。注意事项与限制文件位置固定必须创建在/data/adb/ksu/.ksurc这是 KernelSU 工作目录下的固定路径由 defs.rs 中的常量决定ENV 优先级ksud 仅在ENV尚未设置时才注入su.rslibadbroot 则强制跳过原ENV并覆盖为.ksurcadbroot.cc两种路径行为略有差异脚本语法.ksurc由 mksh 解析应使用 POSIX/mksh 兼容语法避免依赖 bash 专属特性如[[ ]]、数组等只影响 root shell该机制不改变应用进程、非交互式命令或其他 shell 的启动行为内容需谨慎文件以 root 身份加载执行写入的内容相当于 root 级初始化脚本应确保其来源可信、语法正确否则可能导致 root shell 无法正常启动。小结.ksurc是 KernelSU 提供的一个轻量而实用的隐藏功能通过一行ENV环境变量注入把 Android 默认的/system/etc/mkshrc替换为/data/adb/ksu/.ksurc让 root shell 的启动环境完全掌握在用户手中。其实现贯穿内核 sucompat 兼容层、ksud 守护进程与 libadbroot 三条链路本文结合 隱藏功能、su.rs、defs.rs 与 adbroot.cc 进行了逐一拆解读者可按需创建自己的.ksurc为 KernelSU root 环境定制专属的别名、PATH 与变量。【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考