Android 墓碑文件转 FakeCore 开源拉!

2,119 阅读6分钟

前言

关注我很久的同学应该看过之前提到的安卓墓碑文件转 FakeCore 原理,上周末花了两个晚上将此功能添加到了 core-parser 当中了,支持了 arm64armx86_64x86,包含支持开启 PAC 机器。

标题链接
项目介绍基于 Core 文件的 Android 调试与分析套件
原理介绍基于安卓墓碑文件制作 FakeCore 原理
相关素材Android14 使用新特性 record 关键字,请慎行!

如何使用

这里不再进行案例分析,仅介绍如何使用,具体问题在技术交流群里咨询。

Usage: core-parser [OPTION]
Option:
    -c, --core <COREFILE>    load core-parser from corefile
    -p, --pid <PID>          load core-parser from target process
    -m, --machine <ARCH>     arch support arm64, arm, x86_64, x86, riscv64
        --sdk <SDK>          sdk support 26 ~ 35
        --non-quick          load core-parser no filter non-read vma.
    -t, --tomb <TOMBSTONE>   load core-parser form tombstone file
        --sysroot <DIR:DIR>  set sysroot path
        --va_bits <BITS>     set virtual invalid addr bits
        --page_size <SIZE>   set target core page size
Exp:
    core-parser -c /tmp/tmp.core
    core-parser -p 1 -m arm64
    core-parser -t tombstone_00 --sysroot symbols

直接加载

# core-parser -t tombstone_00
FakeCore: saved [tombstone_00.fakecore]
Core load (0x2f71260) tombstone_00.fakecore
Core env:
  * Path: tombstone_00.fakecore
  * Machine: arm64
  * Bits: 64
  * PointSize: 8
  * PointMask: 0xffffffffffffffff
  * VabitsMask: 0x7fffffffff
  * PageSize: 0x1000
  * Remote: false
  * Thread: 1866
Switch android(0) env.
core-parser> f 0
  Native: #00  000000739bf3c580  
  {
      library: 
      symbol: 
      frame_fp: 0x73765fe330
      frame_pc: 0x739bf3c580

      ASM CODE:
      0x739bf3c560: 34000088 | cbz w8, 0x739bf3c570
      0x739bf3c564: d53bd048 | mrs x8, TPIDR_EL0
      0x739bf3c568: f9401d16 | ldr x22, [x8, #0x38]
      0x739bf3c56c: 14000002 | b 0x739bf3c574
      0x739bf3c570: aa1f03f6 | mov x22, xzr
      0x739bf3c574: 91005274 | add x20, x19, #0x14
      0x739bf3c578: d503201f | nop 
      0x739bf3c57c: d503201f | nop 
      0x739bf3c580: b9400282 | ldr w2, [x20]
  }
core-parser> 

直接加载 tombstone 文件,适合用于裸分析程序错误的直接原因,通过 core-parser 查看 PC 附近的汇编代码。

携带动态库加载

直接加载 tombstone 文件,由于缺失原文件对其 LD 部分进行调整,这样生成的 FakeCore 是无法直接在 GDBLLDB 上加载符号表使用的。

core-parser> map
NUM LINKMAP       REGION                   FLAGS NAME
  1 0x102000  [100000, 104000)  rw-  FAKECORE [*]
  2 0x102030  [739bc0b000, 739bd6e000)  r--  /apex/com.android.art/lib64/libart.so [EMPTY]
  3 0x102060  [742c2b9000, 742c307000)  r--  /apex/com.android.runtime/lib64/bionic/libc.so [EMPTY]
  4 0x102090  [71328000, 71337000)  r--  /system/framework/arm64/boot-core-libart.oat [EMPTY]
  5 0x1020c0  [70ff8000, 71094000)  r--  /system/framework/arm64/boot.oat [EMPTY]

场景一

直接加载 tombstone 文件产生 FakeCore,若要在 GDBLLDB 上仍需进行三个步骤进行修复。

  1. 进行 sysroot <SYMBOLS> 映射依赖的原文件;
  2. 进行 fake map --ld 校准 SO 调试链接;
  3. 进行 fake core -r 重建新的 Core 文件;
core-parser> sysroot symbols
Mmap segment [739bc0b000, 739bd6e000) symbols/apex/com.android.art/lib64/libart.so [0]
WARN: Mmap segment [739bc0b000, 739bd6e000) size 163000 != 200000, maybe reset range!
Mmap segment [739be0b000, 739c39c000) symbols/apex/com.android.art/lib64/libart.so [200000]
WARN: Mmap segment [739be0b000, 739c39c000) size 591000 != 600000, maybe reset range!
Read symbols[9911] (/apex/com.android.art/lib64/libart.so)
Mmap segment [742c2b9000, 742c307000) symbols/apex/com.android.runtime/lib64/bionic/libc.so [0]
Mmap segment [742c307000, 742c3c6000) symbols/apex/com.android.runtime/lib64/bionic/libc.so [4e000]
Read symbols[3159] (/apex/com.android.runtime/lib64/bionic/libc.so)
Mmap segment [71328000, 71337000) symbols/system/framework/arm64/boot-core-libart.oat [0]
Mmap segment [71337000, 71379000) symbols/system/framework/arm64/boot-core-libart.oat [f000]
Mmap segment [7137d000, 7137e000) symbols/system/framework/arm64/boot-core-libart.oat [51000]
Read symbols[917] (/system/framework/arm64/boot-core-libart.oat)
Mmap segment [70ff8000, 71094000) symbols/system/framework/arm64/boot.oat [0]
Mmap segment [71094000, 71312000) symbols/system/framework/arm64/boot.oat [9c000]
Mmap segment [71326000, 71327000) symbols/system/framework/arm64/boot.oat [31a000]
Read symbols[7430] (/system/framework/arm64/boot.oat)
WARN: Android sdk no ready, You can enter command:
         env config --sdk <version>
core-parser> fake map --ld
New overlay [100000, 104000)
calibrate /apex/com.android.art/lib64/libart.so l_ld(739c4199d0)
calibrate /apex/com.android.runtime/lib64/bionic/libc.so l_ld(742c3cb2d8)
calibrate /system/framework/arm64/boot-core-libart.oat l_ld(7137e000)
calibrate /system/framework/arm64/boot.oat l_ld(71327000)
core-parser> fake core -r
FakeCore: saved [tombstone_00.fakecore.fakecore]
core-parser> 

场景二

当加载的 tombstone 文件在机器上,无需添加 sysroot,会自动从机器原路径上读取文件,同时这样生成的 FakeCore 已经完成上述的三个步骤。

# core-parser -t tombstone_00 --sysroot symbols

48550543-d999-46dd-9a76-108e5ee2852a.jpeg

重建调试信息

map 无法输出调试所依赖的库文件时,我们需要重建该表,然后再进行上述的三个步骤创建新的 FakeCore 后才能在调试上使用。

core-parser> fake map --auto

例如此个素材,重建后会有更多的依赖库信息。

core-parser> map
NUM LINKMAP       REGION                   FLAGS NAME
  1 0x106000  [104000, 114000)  rw-  FAKECORE [*](OVERLAY)(FAKE)
  2 0x106030  [72fe884000, 72fe892000)  r--  /apex/com.android.adbd/lib64/libadb_pairing_auth.so [EMPTY]
  3 0x106060  [72f6b86000, 72f6ba1000)  r--  /apex/com.android.adbd/lib64/libadb_pairing_connection.so [EMPTY]
  4 0x106090  [72faa00000, 72faa10000)  r--  /apex/com.android.adbd/lib64/libadb_pairing_server.so [EMPTY]
  5 0x1060c0  [738f941000, 738f94e000)  r--  /apex/com.android.adbd/lib64/libadbconnection_client.so [EMPTY]
  6 0x1060f0  [72faa91000, 72faaa5000)  r--  /apex/com.android.adbd/lib64/libbase.so [EMPTY]
  7 0x106120  [72fe901000, 72fe94e000)  r--  /apex/com.android.adbd/lib64/libc++.so [EMPTY]
  8 0x106150  [72fa807000, 72fa86c000)  r--  /apex/com.android.adbd/lib64/libcrypto.so [EMPTY]
  9 0x106180  [72fba85000, 72fba86000)  r--  /apex/com.android.adbd/lib64/libcrypto_utils.so [EMPTY]
 10 0x1061b0  [72fbdda000, 72fbde4000)  r--  /apex/com.android.adbd/lib64/libcutils.so [EMPTY]

最终效果

Vjcw0EtmgK.jpg

后记

目前这个功能还没进行太多的测试,欢迎大家反馈问题,之前挖的坑太多了填不完,鸽了很久的功能,上周熬夜两个晚上把这个坑给填上了。