rwProcMem 适配踩坑记录

最后更新于 23/9/27

旧的 kernel

https://bbs.kanxue.com/thread-278647.htm
他适配了 4.9,但是对于 5x 没有提及
比较低版本的师傅们可以去试试他的方法,我主要讲讲 5x 上是如何使用的

Pixel 6/6P with 5.10 适配

新的内核提供了 build_slider, 但是在这个脚本和原版本的 GKI Build_config 有点区别
我在使用这个脚本的时候遇到点小问题,但是 GKI build 报错了,他直接退出了。。。。

初始化源码,config,ksu

这里不详细说, 可以自行查阅我的内核编译踩坑记录

下载 rwProc

自行 git clone,然后对于 5.10 pixel 6/6p 有两个要注意的修改
我贴在这里,不改会编译失败

diff --git a/ver_control.h b/ver_control.h
index 77013d0..40f69cf 100644
--- a/ver_control.h
+++ b/ver_control.h
@@ -47,9 +47,9 @@
 //#define MY_LINUX_VERSION_CODE KERNEL_VERSION(4,14,117)
 //#define MY_LINUX_VERSION_CODE KERNEL_VERSION(4,14,141)
 //#define MY_LINUX_VERSION_CODE KERNEL_VERSION(4,19,81)
-#define MY_LINUX_VERSION_CODE KERNEL_VERSION(4,19,113)
+//#define MY_LINUX_VERSION_CODE KERNEL_VERSION(4,19,113)
 //#define MY_LINUX_VERSION_CODE KERNEL_VERSION(5,4,61)
-//#define MY_LINUX_VERSION_CODE KERNEL_VERSION(5,10,43)
+#define MY_LINUX_VERSION_CODE KERNEL_VERSION(5,10,43)
 //#define MY_LINUX_VERSION_CODE KERNEL_VERSION(5,15,41)
 #endif
diff --git a/phy_mem.h b/phy_mem.h
index 33fe142..f84ef9b 100644
--- a/phy_mem.h
+++ b/phy_mem.h
@@ -172,9 +172,7 @@ MY_STATIC inline size_t get_task_proc_phy_addr(struct task_struct* task, size_t
                printk_debug("pgd is null\n");
                goto out;
        }
-       printk_debug("pgd_val = 0x%lx pgd addr:0x%lx\n", (unsigned long int)pgd_val(*pgd), (unsigned long int)pgd_val(pgd));
-       printk_debug("init_mm pgd val:0x%lx,pgd addr:0x%lx\n", (unsigned long)pgd_val(*(mm->pgd)), pgd_val((mm->pgd)));
-       printk_debug("pgd_index = %d\n", pgd_index(virt_addr));
+^M
        if (pgd_none(*pgd)) {printk_debug("not mapped in pgd\n");
                goto out;
@@ -417,4 +415,4 @@ MY_STATIC inline size_t write_ram_physical_addr(size_t phy_addr, char* lpBuf, bo

 //Update - RW party: drivers/char/mem.c

-#endif /* PHY_MEM_H_ */
\ No newline at end of file
+#endif /* PHY_MEM_H_ */^M

这两个地方修改之后

cp -r ../rwProcMem33 private/gs-google/drivers

将驱动复制进去
修改 drivers 下的 Makefile
在最后加上

obj-y += rwProcMem33/hwBreakpointProcModule/hwBreakpointProc/
obj-y += rwProcMem33/

修改项目 Makefile 以忽略异常, 在 gs-google 下的 Makefile 的 KBUILD_CFLAGS 上加上 -w

添加符号

这个好像之前的版本不需要,但是现在支持 GKI 的内核需要
打开 /private/gs-google/android/abi_gki_aarch64(GKI 编译)
如果你是用 gs 内核(按照这篇文章),用 abi_gki_aarch64_exynos

插入

  copy_from_kernel_nofault
  register_user_hw_breakpoint
  unregister_hw_breakpoint

这个文件最后会被添加进 symbol list

然后如果出现 Symbols missing from ksymtab:
参考这个 https://source.android.com/docs/core/architecture/kernel/abi-monitor?hl=zh-cn
这是为了提供 KMI 的,所以开启 UNUSED SYMBOLS 就可以

获取 signing key

直接编译内核,由于安全问题,生成的 signing key 会被 clean 掉。所以我们要修改一下 Makefile 让我们能获得 priv key 以便以后对驱动进行签名
https://blog.xzr.moe/archives/236/
先生成秘钥对,x509.genkey 文件

[req]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
x509_extensions = myexts

[req_distinguished_name]
O = Doctor3
CN = Dr3 kernel signing key
emailAddress = mail@qq.com

[myexts]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

然后执行

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 -config x509.genkey -outform PEM -out signing_key.pem -keyout signing_key.priv

这样就能生成一对秘钥用于签名
然后我们设置 defconfig,让内核使用我们自定义的秘钥而不是生成一个
在 gki_defconfig 中设置

CONFIG_MODULE_SIG=/home/kali/Desktop/signing_key.priv
CONFIG_SYSTEM_TRUSTED_KEYS=/home/kali/Desktop/signing_key.pem

使用 slider 的还要在 slider_gki.fragment 中设置
去掉 CONFIG_MODULE_SIG is not set 一行,改成

CONFIG_MODULE_SIG=/home/kali/Desktop/signing_key.priv

编译内核

BUILD_CONFIG=private/gs-google/build.config.slider build/build.sh
正文完
 0
评论(没有评论)