[Android][Kernel]使用crash工具分析ramdump
前言
本篇只讨论如下内容:
1、crash工具下载、编译
2、crash工具使用需要的文件、数据
3、crash工具使用需要传递的参数
本篇不讨论如下内容:
1、crash分析ramdump的指令 —— 后续可能会写
2、kaslr的作用 —— 这个网上很多了
3、内存地址偏移量的含义 —— 这个网上也不少
总之一句话,本篇只讲怎么搭建平台,至于怎么用,怎么分析问题,本篇概不讨论
下载crash工具:
github官网:https://github.com/crash-utility/crash
我们直接下载release即可:https://github.com/crash-utility/crash/archive/7.2.7.zip
(注意:7.2.9可能导致解析ramdump失败,原因不明,因此建议使用7.2.7)
7.2.9报错如下:
/var/tmp/ramdump_elf_N7LVjZ: ELF header read: No such file or directory
crash: malformed ELF file: /var/tmp/ramdump_elf_N7LVjZ
编译crash工具:
解析64位Android kernel使用如下指令编译:
make target=ARM64
期间会下载gdb,请保证网络畅通,或者手动下载(http://ftp.gnu.org/gnu/gdb/gdb-7.6.tar.gz)后放到crash所在目录中;
需要下载的文件:
gdb-7.6.tar.gz
gdb-7.6.patch
获取vmlinux文件
通常存在于out/target/product/<$project>/obj/KERNEL_OBJ/vmlinux
使用工具抓取ramdump
此次是高通手机,ramdump可以直接通过QPST抓取,抓取完成后目录下内容如下:
$ ls Port_COM19/
CD_BTDDR.BIN CODERAM.BIN DDRCS0_0.BIN dump_info.txt IPA_HRAM.BIN IPA_SRAM.BIN MSGRAM11.BIN MSGRAM15.BIN MSGRAM4.BIN MSGRAM8.BIN PARTBIN1.BIN PMON_HIS.BIN
CD_BTIMM.BIN DATARAM.BIN DDRCS1_0.BIN FSM_CTRL.BIN IPA_IU.BIN load.cmm MSGRAM12.BIN MSGRAM1.BIN MSGRAM5.BIN MSGRAM9.BIN PARTBIN2.BIN RST_STAT.BIN
CD_SHIMM.BIN DCC_CFG.BIN DDRCS1_1.BIN FSM_STS.BIN IPA_MBOX.BIN MSGRAM0.BIN MSGRAM13.BIN MSGRAM2.BIN MSGRAM6.BIN OCIMEM.BIN PIMEM.BIN SHRM_MEM.BIN
CD_STRCT.BIN DCC_SRAM.BIN DDR_DATA.BIN IPA_GSI.BIN IPA_SEQ.BIN MSGRAM10.BIN MSGRAM14.BIN MSGRAM3.BIN MSGRAM7.BIN PARTBIN0.BIN PMIC_PON.BIN SN_C6D6B790
加粗文件是此次需要的;
获取kaslr
无视网上各种hexdump -s 偏移位的指令(偏移位并不好确认),此处指令简单粗暴:
使用指令hexdump OCIMEM.BIN | grep dead 可以看到类似如下内容:
$ hexdump Port_COM19/OCIMEM.BIN | grep dead
+0012800 beef dead 0000 0000 0000 0000 0000 0000
00290e0 c0fe dead 0000 0000 0000 0000 0000 0000
002a0c0 0000 0000 0000 0000 c0fe dead 0000 0000
002b6d0 4ead dead 0000 2580 0015 0000 df48 a14b
002bb10 0000 0000 d00d dead 717c 6dcb 01cc d330
直接关注4ead dead这一行,后面的0000 2580 0015 0000即为kaslr
但是由于arm采用little-endian,因此需要倒序读取;
以此为例,此次kaslr为:0x001525800000
确认ramdump的加载偏移量
上面所列的DDRCS0_0.BIN、DDRCS1_0.BIN、DDRCS1_1.BIN为ramdump时内存的实际存储内容,属于原始数据,但是其加载的地址偏移位是未知的,这时就需要借助dump_info.txt的信息来确认了:
1 0x0000000080000000 0000002147483648 DDR CS0 part0 Memo DDRCS0_0.BIN
1 0x0000000100000000 0000002147483648 DDR CS1 part0 Memo DDRCS1_0.BIN
1 0x0000000180000000 0000002147483648 DDR CS1 part1 Memo DDRCS1_1.BIN
加粗的内容就是这三块内存数据加载的偏移位;
至此,我们获取到了crash分析ramdump的所有必要信息,现在只需要进行拼接即可:
使用crash分析ramdump
crash vmlinux Port_COM19/DDRCS0_0.BIN@0x80000000,Port_COM19/DDRCS1_0.BIN@0x100000000,Port_COM19/DDRCS1_1.BIN@0x180000000 --kaslr=0x001525800000
附录:常用指令
log - 查看dmesg
dis -xl <$fun> - 查看某个函数的汇编代码
set <$pid> - 设置需要查看的进程pid
bt -T - 查看调用栈信息
list -s list_head <$addr> - 从某个地址起,查看其往后的链表情况