记一次失败的把 rwProcMem33 编译进 MI MIX2 内核的尝试

故事的开头

故事的开始总是这样,猝不及防。

事情的起因只是想要使用 stackplz 而不得,平替工具也只找到 rwProcMem33,所以就打算自己把 rwProcMem33 编译进内核

如果是 pixel 设备的话,可以参考这两篇文章在内核嵌入 rwProcMem33:

将rwProcMem33编译进安卓内核

Pixel5 内核编译并嵌入rwProcMem33

我测试机是小米设备,一台 MI MIX2(内核 4.4),一台 MI 11 Lite(内核 5.4),都达不到 stackplz 对内核版本 5.10+ 的要求

以下内容是用 MI MIX2 这个设备来做的实验

新的想法

“要不要试试 LineageOS”

“那是什么”

最开始以为小米没有开源内核,就选择了换成开源的 LineageOS 系统

我的测试机之前装过 twrp ,所以就用的 twrp 来刷的,参考小米手机刷入 LineageOS 教程

与设备适配的 LineageOS 镜像就在官网找到,把最新的系统镜像,boot.img 和 recovery.img 都下载了

小插曲

以后应该再也不会像上次那样局促了。

说起 twrp,又想起之前刷机先是跟着一篇错误的文章试后面又被 ai 骗了的经历,唉,现在想想其实当时自己根本还没搞清楚 twrp 是什么(其实就是方便刷机的第三方 recovery),甚至对 rom,rec,fastboot 等等这些概念都模糊不清,其实还是因为没亲手搞过,当真正自己上手的时候很多东西很容易就明白了

TWRP 下载网址

刷入 TWRP 官方教程

使用 TWRP 刷 MIUI 开发版方法

泥嚎,LineageOS

初次见面,请多指教。

准备源码

lineageos wiki 的 device 里面可以看到详细的设备信息,Kernel Version 后面也贴了内核源码

先尝试不嵌入 rwProcMem33 编译内核,我是选择在 wsl 里面编译的

网上编译 LineageOS 内核的博客也不多,试了几种方式最后让我成功编译的是参考这篇文章 lineageos_simple_kernel_build,it’s super useful!

先把内核源码克隆下来

1
2
git clone https://github.com/LineageOS/android_kernel_xiaomi_msm8998
KERNEL_NAME=android_kernel_xiaomi_msm8998

准备工具链

在 https://github.com/LineageOS/android 选择构建内核对应的 linegasos 版本,然后在 snippets/lineage.xml 中搜索 prebuilts/ 找到需要的工具链,把它们拉下来

1
2
3
4
5
6
git clone https://github.com/LineageOS/android_prebuilts_clang_kernel_linux-x86_clang-r416183b \
-b lineage-20.0 || true
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9 \
-b lineage-19.1 || true
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9 \
-b lineage-19.1 || true

编译内核

记录下所有准备文件所在的目录并进入内核源码目录

1
2
BASEDIR=$PWD
cd $KERNEL_NAME

清除所有内容,包括删除任何旧的内核配置文件(Mr. Proper 其实是英国清洁用品品牌)

1
make mrproper

指定输出目录,之后构建内核时,结果文件都位于 $KERNEL_NAME/out

1
mkdir -p out

在 $KERNEL_NAME/arch/arm64/configs 目录下找到设备内核对应的配置文件,我的是 msm-perf_defconfig,然后生成新的内核配置

ps: 获取内核版本 cat /proc/version 或者 uname -r

1
2
3
4
make \
O=out \
ARCH=arm64 \
msm-perf_defconfig

记录每个工具链的路径

1
2
3
GCCDIR=$BASEDIR/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9
GCCDIR32=$BASEDIR/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9
CLANGDIR=$BASEDIR/android_prebuilts_clang_kernel_linux-x86_clang-r416183b

最后编译内核

1
2
3
4
5
6
7
8
9
10
make \
O=out \
ARCH=arm64 \
PATH=$CLANGDIR/bin:$GCCDIR/bin:$PATH \
LD_LIBRARY_PATH=$CLANGDIR/lib \
LLVM=1 \
CROSS_COMPILE=$GCCDIR/bin/aarch64-linux-android- \
CROSS_COMPILE_ARM32=$GCCDIR32/bin/arm-linux-androideabi- \
CLANG_TRIPLE=aarch64-linux-gnu- \
-j$(nproc)

成功编译后生成的 img 文件在 out/arch/arm64/boot/ 目录下

替换内核

参考Android 搞机之编译 lineageOS 内核

下载 AnyKernel3

1
git clone --depth=1 https://github.com/osm0sis/AnyKernel3.git

编辑 anykernel.sh 文件

1
2
3
do.devicecheck=0 # 关闭设备检查
# BLOCK=/dev/block/platform/omap/omap_hsmmc.0/by-name/boot # 注释掉原有的 boot 分区路径
BLOCK=auto; # 设置为自动检测分区

将编译成功的内核 Image 文件复制到 AnyKernel3 根目录下

将 Anykernel3 根目录下的所有文件打包成 zip 压缩包

1
zip -r9 Anykernel.zip *

用 twrp 刷入 Anykernel.zip,重启系统

这里我用 twrp 卡刷失败了,貌似是因为现在刷入的 rom 是安卓 15,之前下载的 twrp 是对应安卓 9 的,然后我又给手机刷了 Lineageos 的原厂 rec, 参考LineageOS刷机教程

手机关机状态下,按住 音量下 + 电源键 进入 fastboot 模式

1
fastboot flash recovery <recovery_filename>.img

进入 LineageOS recovery 模式

1
adb reboot recovery

选择 Apply update

因为我没插外置 sd 卡,就选择 adb sideload,但是我选了之后电脑端识别不到设备,最后是用搞机助手刷上去的

到这里本应该完美结束,但是实际上我刷入后手机黑屏,进不了系统,啊啊啊可恶,不过大概率是编译内核时为了修报错改源码出了问题

编译过程中遇到的报错,试了好几种方式要么没效果要么产生新的报错,后面 ai 给的提议说问题函数不影响功能让直接注释掉,有点离谱了、、、虽然这样确实能过编译这关,不过也可想而知刷机黑屏的原因了

列一下报错吧

报错1:

1
2
../kernel/sched/rt.c:2136:16: error: implicit declaration of function 'schedtune_prefer_idle' [-Werror,-Wimplicit-function-declaration]
prefer_idle = schedtune_prefer_idle(task) > 0

报错2:

1
2
3
4
5
6
7
8
ld.lld: error: undefined symbol: kick_usbpd_vbus_sm
>>> referenced by xhci-ring.c:1310 (/home/eleven/kernel/android_kernel_xiaomi_msm8998/out/../drivers/usb/host/xhci-ring.c:1310)
>>> drivers/usb/host/xhci-ring.o:(xhci_handle_command_timeout) in archive built-in.o
>>> referenced by pcm.c:545 (/home/eleven/kernel/android_kernel_xiaomi_msm8998/out/../sound/usb/pcm.c:545)
>>> sound/usb/pcm.o:(set_format) in archive built-in.o
make[1]: *** [/home/eleven/kernel/android_kernel_xiaomi_msm8998/Makefile:1062: vmlinux] Error 1
make[1]: Leaving directory '/home/eleven/kernel/android_kernel_xiaomi_msm8998/out'
make: *** [Makefile:152: sub-make] Error 2

忘记了…

我当时做的时候忘记先把不嵌入 rwProcMem33 编译出的内核刷进去测试了,还尝试了把 rwProcMem33 嵌入编译

嵌入 rwProcMem33

在内核源码的 drivers 目录下新建 rwProcMem33 目录,里面放入 hwBreakpointProcModule 和 rwProcMem33Module 文件夹,然后分别修改 hwBreakpointProcModule\hwBreakpointProc_module\ver_control.h 和 rwProcMem33Module\rwProcMem_module\ver_control.h

修改 ver_control.h

把里面的 MY_LINUX_VERSION_CODE 切换到自己内核对应的版本

修改 drivers/Makefile

在 drivers/Makefile 添加

1
2
obj-y += rwProcMem33/hwBreakpointProcModule/hwBreakpointProc_module/
obj-y += rwProcMem33/rwProcMem33Module/rwProcMem_module/

byebye warning

修改内核源码根目录下的 Makefile,在-Wno-format-security 后加上一个 -w 参数,忽略编译警告

同上

接着就和上文一样的步骤进行编译了

替换内核,刷入手机,黑屏进不了系统(叹气)

故事的结尾

好像全都白干了。

等等,不是结尾??!

周六晚上本来也打算就此放弃了,犹豫之后和其他师傅交流了下得到了新的思路,去了解了下适配小米系统的潘多拉内核,但是查找资料之后发现刷这个内核也是要与手机内核版本对应的,比如 5.10.z 就只能下载刷入 5.10.z 的内核,5.15.z 就只能下载刷入 5.15.z的内核;

没有办法实现从高版本到低版本的替换

另外的路

没路了怎么办,像索隆一样用剑劈一条出来。

骗你的,其实自己根本劈不开(哭了

接着是另外一条路,小米mix2ksu以及如何去修补

尝试了把这篇文章里面的 kernelsu 刷进去,小米官方的 MIX2 的 ROM 最高版本是安卓 9,上面文章中测试成功的是 安卓 11,担心适配问题,就去找了个魔改的安卓 11 的 ROM 和适配的 twrp 重新刷上去

ps:小米官方镜像网站下载无敌慢,在 https://miuiver.com/ 这个网址下会快很多

刷入 kernelsu 后,看到内核版本依旧是 4.4.302,并没有提升

然后在酷安和 XDA 上翻了个遍,企图找到有无民间大佬编译好的适配设备的 5.10+ 内核,看到半夜,发现是条死路,无。

后面又在想要试着编译小米官方内核,它是有开放源码的 Xiaomi_Kernel_OpenSource,但是当我尝试把官方 ROM 重新刷进去失败的时候,突然有点不太想继续了,凭借着现在的能力,想要成功编译出一个能用的 5.10+ 内核几乎不太可能,因为都没深入学过内核方面的知识,遇到报错基本上也是参考 ai 给的解决方式,出错的机率太大,不确定性太多,不想让沉没成本继续增加了,就此收手。

还会再见吗

故事的结局是?

没有结局。

研究了大半周最后好像只能买台 pixel 6 来解决问题,哈哈。

至于为什么还要把这个失败的经历写出来,可能是宽慰自己并非毫无收获的借口(?)

我哭了虽然好像确实没学到太多东西

或者希望等到有更多储备之后再来回看或者继续尝试吧。

又或者,想记录下过程中情绪的起起伏伏,会为有新的想法感到无比兴奋,又可以怀揣着希望睡觉了,狠狠期待第二天接着折腾,也会因为探索中的不顺利生气和难受,可恶啊,最后是平静的放弃了,emm,暂且放弃。

好像体验到了和打 CTF 拿 flag 不一样的神奇感觉。

不是一个迷茫的逆向手了。至少最近不是。


记一次失败的把 rwProcMem33 编译进 MI MIX2 内核的尝试
http://example.com/2025/12/01/kernel_fail/
作者
Eleven
发布于
2025年12月1日
许可协议