提取boot镜像
dd if=/dev/block/by-name/boot of=/sdcard/boot.img
然后使用 ADB 拖到电脑备用.
解包boot.img
这里使用imjtool工具
./imjtool <path to boot.img> extract
解包后的文件将被放在./extracted
目录, 分别有kernel
(内核image), kernelimage
(内核defconfig), ramdisk
(ramdisk包, 通常是cpio
格式)
预处理Image
重头戏来了, 这里我们选择droidimg来配合IDA Pro
完成这个任务.
跳过头部标识
Linux
内核在生成的时候有时会在头部添加一些信息, 以供fastboot
读取. 一般来说分别是, 16字节的UNCOMPRESSED_IMG
和4字节的大小信息.
验证
这里先直接使用IDA Pro
打开未经处理的Image, 处理器类型记得选择ARM Little-endian
(不用纠结, Android设备全是Little-endian
), 一路确定就行.
切换到16进制查看器页面, 可以很清楚的看到头部有UNCOMPRESSED_IMG
标识.
处理
dd if=<path to origin image> of=<path to patched image> bs=1 skip=20
对启用kaslr的内核进行额外处理
验证
还记得刚刚拿到的kernelimage
不, 打开他. 搜索CONFIG_RANDOMIZE_BASE=y
, 如果有匹配内容说明就需要进行下一步处理了
处理
进入droidimg
目录并自行编译fix_kaslr_arm64.c
.
<fix_kaslr_arm64> <patch to origin image> <path to patched image>
反编译Image
安装droidimg到ida
将droidimg
目录下的vmlinux.py
复制进IDA Pro
安装目录下的loaders
里, 注意你可能需要解决相应的python
依赖.
打开Image
最后用IDA Pro
打开我们最终的Image, 文件类型选择Android/Linux Kernel Image(ARM)
即可.