0%

绕过内核模块加载校验 (check_version)

环境

Redmi K40 GamingMIUI 12.5.8

提取boot.img

查看文件名:

1
ls -al /dev/block/by-name | grep boot

提取boot.img

1
dd if=$(readlink /dev/block/by-name/boot_a) of=/sdcard/boot.img

提取内核

法1 PC

自己编译或者使用affggh/magiskbootkitchen

1
2
adb pull /sdcard/boot.img .
./magiskboot unpack boot.img

法2 手机

1
./magiskboot unpack /sdcard/boot.img

反编译

使用IDA64打开kernel,选择ARM processer64-Bit
执行Python脚本:

1
2
3
import idc
for i in range(0, 0x100000):
idc.create_insn(i)

然后等待IDA分析结束。

定位check_version

使用010Editor搜索字符串disagrees about version of symbol,复制地址。
IDA64中查看交叉引用,定位到的函数即为check_version

Patch

将函数体的第一个跳转Patch为B指令。然后F5,查看返回值是否为1。

例如:
CBZ X2, loc_FB8A8
Patch为:
B loc_FB8A8

相关代码:

1
2
3
ROM:00000000000FB8A8                               loc_FB8A8                               ; CODE XREF: sub_FB804+14↑j
ROM:00000000000FB8A8 35 00 80 52 MOV W21, #1
ROM:00000000000FB8AC 0A 00 00 14 B loc_FB8D4
1
2
3
4
5
6
7
8
9
ROM:00000000000FB8D4                               loc_FB8D4                               ; CODE XREF: sub_FB804+74↑j
ROM:00000000000FB8D4 ; sub_FB804+90↑j
ROM:00000000000FB8D4 ; sub_FB804+A8↑j
ROM:00000000000FB8D4 E0 03 15 2A MOV W0, W21
ROM:00000000000FB8D8 F4 4F 43 A9 LDP X20, X19, [SP,#0x20+var_s10]
ROM:00000000000FB8DC F6 57 42 A9 LDP X22, X21, [SP,#0x20+var_s0]
ROM:00000000000FB8E0 F7 0B 40 F9 LDR X23, [SP,#0x20+var_10]
ROM:00000000000FB8E4 FD 7B C4 A8 LDP X29, X30, [SP+0x20+var_20],#0x40
ROM:00000000000FB8E8 C0 03 5F D6 RET

参考

绕过Android内核模块加载验证