wbstack / watch breakpoint stack

wbstack/watch breakpoint stack/stackplz plus 基于eBPF实现硬件断点,支持栈回溯与上下文读取

需要 5.10+ 的 arm64 内核,如果不读取上下文,则要求内核至少开启CONFIG_HAVE_HW_BREAKPOINT选项

执行命令前确保目标进程已经在运行,必须通过-p/--pid指定进程号

需要将软件放在/data/local/tmp下使用,整体用法与stackplz类似:

小姿势:如果追踪的进程会fork出新进程,不妨增加-u/--uid选项

V3命令演示

2024/07/14 V3 LINK

v3版本支持了多个断点(最多6个),用法与原有uprobe hook命令类似,区别在于需要设置断点类型

如果要设置动态库,那么通过-l选项指定,将尝试从对应的进程查找动态库base

此版本简化了原先的命令设置,不再使用--brk选项

./wbstack_arm64 -p `pidof com.sfx.ebpf` -l libnative-lib.so -w 0xf3a4:x -w 0x2888e:r[ptr,ptr:pc]
./wbstack_arm64 -p `pidof com.sfx.ebpf` -l libnative-lib.so -w 0xf3a4:x[str,ptr,buf:32:x0] -w 0x2888e:r --color --dumphex --reg pc
./wbstack_arm64 -p `pidof com.sfx.ebpf` -l libnative-lib.so -w 0xf3a4:x --kill SIGSTOP
./wbstack_arm64 -p `pidof com.sfx.ebpf` -w 0x73f7d123a4:x --kill SIGSTOP --stack
./wbstack_arm64 -p `pidof com.sfx.ebpf` -w 0x73f7d123a4:x[ptr] --stack --mstack

V2命令演示

2024/06/30 V2 LINK

./wbstack_arm64 -p `pidof com.sfx.ebpf` --brk 0x6dd9d563a4:x --stack

2024-06-29T12:17:04.png

需要在命中硬件断点时读取上下文,则通过-w设定读取参数类型:

./wbstack_arm64 -p `pidof com.sfx.ebpf` --brk 0x6dd9d563a4:x -w 0x0[str,ptr,buf:32:x0] --color --dumphex

2024-06-29T12:18:19.png

支持 偏移 + 动态库 的形式指定硬断地址:

./wbstack_arm64 -p `pidof com.sfx.ebpf` --brk 0xF3A4:x --brk-lib libnative-lib.so -w 0x0[str,ptr,buf:32:x0] --color --dumphex --stack

2024-06-29T12:17:52.png

支持在命中硬件断点时给进程发送信号,v2版本需要额外加上-w 0x0[ptr](如果是SIGSTOP,请按c回车恢复进程运行):

./wbstack_arm64 -p `pidof com.sfx.ebpf` --brk 0xF3A4:x --brk-lib libnative-lib.so -w 0x0[str,ptr,buf:32:x0] --color --dumphex --stack --jstack --kill SIGSTOP

2024-06-29T12:17:24.png

下读取断点,并获取参数信息:

./wbstack_arm64 -p `pidof com.sfx.ebpf` --brk 0x2888E:r --brk-lib libnative-lib.so -w 0x0[ptr,ptr,ptr] --stack --kill SIGSTOP --brk-len 1

2024-06-30T14:42:39.png