前言
关注我很久的同学应该看过之前提到的安卓墓碑文件转 FakeCore
原理,上周末花了两个晚上将此功能添加到了 core-parser
当中了,支持了 arm64
、arm
、x86_64
、x86
,包含支持开启 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
是无法直接在 GDB
、LLDB
上加载符号表使用的。
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
,若要在 GDB
、LLDB
上仍需进行三个步骤进行修复。
- 进行
sysroot <SYMBOLS>
映射依赖的原文件; - 进行
fake map --ld
校准 SO 调试链接; - 进行
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
重建调试信息
当 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]
最终效果
后记
目前这个功能还没进行太多的测试,欢迎大家反馈问题,之前挖的坑太多了填不完,鸽了很久的功能,上周熬夜两个晚上把这个坑给填上了。