吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3712|回复: 30
上一主题 下一主题
收起左侧

[Android 原创] 解包小米11的boot.img,还原内核符号以及地址

[复制链接]
跳转到指定楼层
楼主
jbczzz 发表于 2024-10-24 16:59 回帖奖励
本帖最后由 jbczzz 于 2024-10-24 17:03 编辑

0x0 前言
因为一些教程过于老旧,为了防止自己以后重复踩坑,故记录一下学习过程中遇到的一些坑和现在有效的方法。
设备:mi 11 venus 内核版本5.4.210
0x1 解包boot.img
提取内核什么的就直接跳过,网上有很多资料都是可以直接用的,去官网下包或者有root的dd提取都可以。
首先先大概了解一下安卓内核
比较重要的几个分区如下:
1、/boot分区:该分区主要包含android kernel镜像和ramdisk(一种将RAM模拟为硬盘的技术,提高访问速度)。
2、/system分区:该分区主要存放Android框架及其相关配置,包含系统预装的app。
3、/recovery分区:该分区主要是备份的分区
4、/data 用户数据的存储区域
/data/app/com.xxxx/ 以包名存放应用安装文件,包括base.apk /lib
/data/data/com.xxxx/ 存放应用数据,包括sp、db等
/data/dalvik-cache 以包名存放优化过的应用dex文件
5、/cache分区:Android系统缓存区域,保存系统最常访问的数据和应用程序。
6、/misc分区:此分区包含一些系统功能设置开关和数据,比如USB设置。
7、sdcard分区:外置存储分区
8、/vendor分区:厂商定制的分区,厂商的某些系统升级可以通过这个分区来实现。


boot.img就是android系统的Linux内核主要的镜像文件,在该文件中大致包含boot header,kernel,ramdisk。
boot.img文件跳过2K的文件头之后,包含两个gz压缩包,一个是boot.img-kernel.gz Linux内核,一个是boot.img-ramdisk.cpio.gz,然后加上ramdisk文件。
https://bbs.kanxue.com/thread-266625.htm

然后我按照这篇文章中的步骤尝试去提取kernel的时候发现里面的工具不能正常解析mi11的boot,尝试了其他的一些工具也无法正常提取

正在我看他各种工具实现方法,binwalk解出来的包死活解压不了的时候,突然想起来很久之前root的时候看到的一个工具
https://github.com/affggh/magiskbootkitchen

用这个能正常提取,那就先偷个懒,以后有空再看看那些工具的原理和失效的原因,不过感觉是因为这个内核删掉了一些信息。

用magiskbootkitchen提取之后,获得了两个文件

把文件放到IDA里,能正常识别

0x2 获取内核符号地址
然后就是获取内核符号地址了
首先先去除kptr_restrict,然后就能在  /proc/kallsyms里获得内核符号的地址
[Asm] 纯文本查看 复制代码
echo 0 > /proc/sys/kernel/kptr_restrict
cat /proc/kallsyms > kernel_symbols.txt

https://zhuanlan.zhihu.com/p/359234823


我查资料正常来说内核的起始地址应该是0xffffffc000080000,但是我这个起始地址是0xFFFFFFE54F280000,在ida里重新设定基地址 Edit-->Segments--> Rebase Program,然后用python脚本按照kernel_symbols.txt里的对照关系把所有函数都重命名一下
[Python] 纯文本查看 复制代码
import idaapi
import idautils
import idc
 
def do_rename(l):
    splitted = l.split()
    straddr = splitted[0]
    strname = splitted[2].replace("\r", "").replace("\n", "")
 
    eaaddr = int(straddr, 16)
    idc.create_insn(eaaddr)
    ida_funcs.add_func(eaaddr)
    idc.set_name(int(straddr, 16), strname, idc.SN_NOWARN)
 
if __name__ == "__main__":
    ida_kernwin.msg("Hello IDC")
    f = open( "F:\\kernel_symbols.txt", "r")
    for l in f:
        do_rename(l)
    f.close()

这个是ida pro 7.7的,如果脚本语法版本不对的话
https://docs.hex-rays.com/archive/porting-guide-for-ida-7.4-turning-off-ida-6.x-api-backwards-compatibility-by-default

参考这个修改一下对应的函数。
看一下效果

至此还原符号成功了。
0x3 小结
起始如果只是想看内核函数的话,之前有个大佬给的这个网址
https://elixir.bootlin.com/linux/v6.11.5/source

就能直接看各个版本内核函数的源码,不过各个厂商之间好像还是会有一些差距,用本文的方法还原出来的会更全一点。

免费评分

参与人数 15威望 +2 吾爱币 +115 热心值 +12 收起 理由
4nfu + 1 热心回复!
gaosld + 1 + 1 热心回复!
qtfreet00 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
打酱油路过7194 + 1 + 1 谢谢@Thanks!
ghimi + 1 热心回复!
11445 + 1 我很赞同!
alentonly + 1 + 1 我很赞同!
xshadow + 1 + 1 谢谢@Thanks!
Psyber + 1 谢谢@Thanks!
小狸 + 1 + 1 我很赞同!
geliang715 + 1 + 1 谢谢@Thanks!
smile1110 + 3 + 1 66666666666666
杨辣子 + 1 + 1 用心讨论,共获提升!
为之奈何? + 1 + 1 我很赞同!
泠月酱 + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
hansxia 发表于 2024-10-24 23:53
试试这个 magiskbootkitchen,我有个固件也是binwalk解压后 file 那个文件显示data而不是gzip之类的格式

沙发
maoyj 发表于 2024-10-24 20:48
3#
abandoncs 发表于 2024-10-24 23:25
5#
mfpss95134 发表于 2024-10-25 03:05
厉害...谢谢楼主分享
6#
tzlqjyx 发表于 2024-10-25 07:32
感谢感谢
7#
hongyuxue52 发表于 2024-10-25 08:30
太专业了,看不懂
8#
027rainguai 发表于 2024-10-25 08:53
大佬,能不能看看这个怎么搞。  https://www.52pojie.cn/thread-1350106-1-1.html
9#
tyq2003 发表于 2024-10-25 09:30
大佬,为你点赞
10#
Schocolade 发表于 2024-10-25 09:37
感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 08:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表