The quiter you become,the more you are able to hear!

从Android手机中提取内核

Author: geneblue

Blog: https://geneblue.github.io/

0X01 环境

Device: Nexus 5
OS Version: Android4.4.4 KTU84P
Kernel Version: 3.4.0

0X02 内核提取

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

adb shell
su
cd /dev/block/platform/msm_sdcc.1/by-name
ls -l boot

get boot

这个boot文件是个软链接,/dev/block/mmcblk0p19 即是boot分区

用dd将其dump出来

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

用binwalk分析boot.img

sudo binwalk boot.img

binwalk

从boot.img中提取出压缩的内核文件:

dd if=boot.img of=kernel.gz bs=1 skip=20660

dd kernel

解压:

gzip -d kernel.gz 
sudo binwalk kernel

这个kernel中不包含符号信息,所以还要从设备中提取符号信息: /proc/kallsyms文件中存储了所有内核符号,但文件中存储的地址值都是0,这是为了防止内核地址泄露

kallsyms

要获取地址,可以修改 /proc/sys/kernel/kptr_restrict 值,要以root权限

echo 1 > /proc/sys/kernel/kptr_restrict

kallsyms

之后便可以拿到内核符号。

0X03 IDA分析

对于提取出来的kernel文件,可以直接放到ida中分析

IDA

注意处理器类型选择ARM小端,然后设置内核起始地址为0xC0008000

IDA

随后,就可以在IDA中查看感兴趣的汇编代码了

IDA Analysis

这时的函数名不太友好,向IDA中导入之前提取出来的符号信息就可以看到对应的函数名。

ksyms = open("C:\Users\Mr\Desktop\GetKernel\syms.txt")
for line in ksyms:
    addr = int(line[0:8],16)
    name = line[11:]
    idaapi.set_debug_name(addr,name)
    MakeNameEx(addr,name,SN_NOWARN)
    Message("%08X:%sn"%(addr,name))

在IDA的File->Script Command中运行上述python脚本,之后就可以在IDA中成功添加符号信息

IDA Analysis

之后就可以具体分析内核代码了