参考文章:https://bbs.kanxue.com/thread-272958.htm
https://github.com/xiaokanghub/Android-Kenerl-boot.img
前置
本次逆向的内核为运行在Xiaomi Redmi Note 11T Pro的Miui 14,内核版本为:5.10.101
提取boot.img
tip:关于A/B boot分区,咨询了网友,官方默认A分区为主
1 2
| # 提取A分区的boot.img dd if=$(readlink /dev/block/by-name/boot_a) of=/sdcard/boot.img
|
经验证A分区提取出来的boot.img与之前刷入的boot.img相同

解包 boot.img
使用magiskboot解包boot.img,github下载一份别人编译好的magiskboot
1
| ./magiskboot unpack boot.img
|
可得到kernel、ramdisk.cpio文件,其中kernel为内核vmlinux镜像,拖到IDA逆就完事了
解析内核符号
1.提取内核符号表
1 2 3 4 5
| echo 0 > /proc/sys/kernel/kptr_restrict
cat /proc/kallsyms > /sdcard/kallsyms.txt
|
2.在IDA中匹配符号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import re pattern = re.compile('(\w+) (\w) (.+)\n',re.M) fp = open("C:/kallsyms.txt","r") while True: line = fp.readline() if not line: break matchs = pattern.match(line) addr = int(matchs.group(1),16) name = matchs.group(3) if('$' in name): continue print(addr,matchs.group(2),name) if not idaapi.add_entry(addr,addr,name,0): print('Naming failed',hex(addr),matchs.group(2),name) if 't' == matchs.group(2) or 'T' == matchs.group(2): ida_ua.create_insn(addr)
|
重打包boot.img
1
| ./magiskboot repack boot.img
|