GitHub - TexLui/android_extract_kernel: newbie

android 提取内核指南

@(盘古石)[kernel, android]

获得对应的 boot.img

拥有 root 权限的情况

Android 内核文件存放在boot分区,先在设备中找到boot分区存放的位置:

cd /dev/block/platform/msm_xxx/by-name/
ls -l boot

这个boot文件是个软链接,指向对应的/dev/block/xxx 即是boot分区数据。 用dd将其dump出来:

dd if=/dev/block/xxx of=/sdcard/boot.img

官方网站下载对应的 ROM

小米的ROM包都是.zip格式,可以轻松解包,得到内含的boot.img。从此处获得小米 ROM 下载链接。

OPPO 的ROM包是.ozip格式,无法直接解包,它是由.zip格式压缩后再通过 OPPO 自己的设计的密钥算法进行加密形成的.ozip格式包。可以自己通过反编译recovery文件来得到密钥。从此处获得python3脚本可以转换.ozip.zip文件。

得到.zip包后可以解压出boot.img文件。

提取内核镜像文件

使用imgtool工具分离boot.img文件,一般有kernelkernelimageramdisk等相关文件。分离工具从此处获得。

    imjtool.ELF64 /PATH/boot.img extract

此时,需要确定其中有效的内核镜像,针对kernelkernelimage使用命令检查是否有输出。

strings xxx | grep "Linux version "

当然,也有可能该文件是.gzip压缩文件,需要解压缩。

内核镜像反随机化

查看是64位或者是32位的内核镜像后,使用不同的程序进行去随机化,从此处获得资源。

例如:
./fka64 extracted/kernel vmlinux

ps. 若无法去除随机化,可能是内核镜像本身有多余的数据,导致无法识别。

dd if=kernel of=kernel2 bs=1 skip=xxx 

获得内核数据

最后,使用ida pro打开vmlinux文件,同时ida proloader文件夹里放入vmlinux.py该脚本可以解析kallsyms符号表。

自动化脚本

需要一个参数, boot.img所在目录的绝对路径

# !/bin/sh

if [ ! -n "$1" ];then
    echo "you need input PATH !"
    exit 1
fi

rm -r extracted/
./imjtool.ELF64 $1boot.img  extract

check_result1=`strings extracted/kernel | grep "Linux version "`
check_result2=`strings extracted/kernelimage | grep "Linux version"`


if [ -n "$check_result1" ];then
    ./fka64 extracted/kernel $1vmlinux
elif [ -n "$check_result2" ];then
    ./fka64 extracted/kernelimage $1vmlinux
else
    echo "kernel wrong"
    exit 3
fi
exit 0