首页
社区
课程
招聘
Android使用perf_event实现硬断点
2024-2-15 21:14 3614

Android使用perf_event实现硬断点

2024-2-15 21:14
3614

背景

在Android中,目前有一下几种方式实现硬件断点。

  1. GDB Server
  2. rwProcMem33等此类内核模块

但是这些方式都有一些问题,比如GDB Server需要使用ptrace附加在目标进程,容易被检测。rwProcMem33等内核模块需要内核头文件,不开源内核难以使用,此外触发一次断点后会导致整个线程卡死,直到断点删除。

使用linux perf_event机制实现硬件断点可以在不附加在目标进程、不安装内核模块的情况下下断,同时也无法被目标进程检测。
该方法支持读、写、执行断点,可以读写断点设置1、4、8字节长度。断点后可以输出此时的寄存器信息。

项目地址: ri-char/pwatch

原理

使用perf_event_open系统调用,设置断点类型为PERF_TYPE_BREAKPOINTsample_typePERF_SAMPLE_REGS_USER,可以采样寄存器信息。
将断点信息填入结构体后使用perf_event_open创建perf_event,返回一个fd。使用mmap打开该fd可以得到断点出发后的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let mut attrs = sys::bindings::perf_event_attr::default();
 
attrs.size = std::mem::size_of::<sys::bindings::perf_event_attr>() as u32;
attrs.type_ = sys::bindings::PERF_TYPE_BREAKPOINT;
attrs.__bindgen_anon_1.sample_period = 1;
attrs.__bindgen_anon_2.wakeup_events = 1;
attrs.bp_type = r#type;
attrs.__bindgen_anon_3.bp_addr = addr;
attrs.__bindgen_anon_4.bp_len = len as u64;
attrs.set_precise_ip(2);
attrs.sample_type = sys::bindings::PERF_SAMPLE_REGS_USER | sys::bindings::PERF_SAMPLE_TID;
attrs.sample_regs_user = arch::SAMPLE_REGS_USER;
 
sys::perf_event_open(
    &mut attrs,
    pid,
    -1,
    -1,
    (sys::bindings::PERF_FLAG_FD_CLOEXEC) as u64,
)

sample_type还可以加上PERF_SAMPLE_STACK_USER,获取用户调用栈信息。


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞4
打赏
分享
最新回复 (5)
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_qnxaollu 2024-2-20 15:40
2
0
第一种怎么实现呢。
雪    币: 21
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_晚风_407 2024-2-20 17:23
3
0

..

最后于 2024-2-20 20:25 被wx_晚风_407编辑 ,原因:
雪    币: 1112
活跃值: (2704)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Amun 2024-2-20 18:57
4
0
 牛批
雪    币: 32
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ri_Char 2024-2-20 20:44
5
0
mb_qnxaollu 第一种怎么实现呢。
使用ptrace的PTRACE_GETREGSET和PTRACE_SETREGSET修改REGSET_HW_BREAK和REGSET_HW_WATCH,内核中这两个regset的定义在这里
https://elixir.bootlin.com/linux/v5.15.148/source/arch/arm64/kernel/ptrace.c#L1470
雪    币: 35
活跃值: (1054)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dreameriii 2024-3-2 21:10
6
0

大佬太强了,正好需要这个功能,感谢无私分享!  

最后于 2024-3-3 09:37 被dreameriii编辑 ,原因:
游客
登录 | 注册 方可回帖
返回