rogxo@home:~$

安卓内核逆向

参考文章: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分区为主

# 提取A分区的boot.img
dd if=$(readlink /dev/block/by-name/boot_a) of=/sdcard/boot.img

经验证A分区提取出来的boot.img与之前刷入的boot.img相同 e28b386145031ed9fe7f54ca7e5703fe.png

解包 boot.img

使用magiskboot解包boot.img,github下载一份别人编译好的magiskboot

./magiskboot unpack boot.img

可得到kernel、ramdisk.cpio文件,其中kernel为内核vmlinux镜像,拖到IDA逆就完事了

解析内核符号

1.提取内核符号表

# 关闭内核指针限制(不关闭只有符号看不见地址)
echo 0 > /proc/sys/kernel/kptr_restrict
# save kallsyms
cat /proc/kallsyms > /sdcard/kallsyms.txt
# 其中 ffffffe054200000 T _text 为内核加载基址

2.在IDA中匹配符号

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

./magiskboot repack boot.img