记一次失败的把 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.imgrecovery.img 都下载了

小插曲

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

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

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 目录,里面放入 hwBreakpointProcModulerwProcMem33Module 文件夹,然后分别修改 hwBreakpointProcModule\hwBreakpointProc_module\ver_control.hrwProcMem33Module\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日
许可协议