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
这个boot文件是个软链接,/dev/block/mmcblk0p19 即是boot分区
用dd将其dump出来
dd if=/dev/block/mmcblk0p19 of=/sdcard/boot.img
用binwalk分析boot.img
sudo binwalk boot.img
从boot.img中提取出压缩的内核文件:
dd if=boot.img of=kernel.gz bs=1 skip=20660
解压:
gzip -d kernel.gz
sudo binwalk kernel
这个kernel中不包含符号信息,所以还要从设备中提取符号信息: /proc/kallsyms文件中存储了所有内核符号,但文件中存储的地址值都是0,这是为了防止内核地址泄露
要获取地址,可以修改 /proc/sys/kernel/kptr_restrict 值,要以root权限
echo 1 > /proc/sys/kernel/kptr_restrict
之后便可以拿到内核符号。
0X03 IDA分析
对于提取出来的kernel文件,可以直接放到ida中分析
注意处理器类型选择ARM小端,然后设置内核起始地址为0xC0008000
随后,就可以在IDA中查看感兴趣的汇编代码了
这时的函数名不太友好,向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中成功添加符号信息
之后就可以具体分析内核代码了