首页
社区
课程
招聘
[原创] eBPF追踪系统调用工具
2023-6-14 22:47 7712

[原创] eBPF追踪系统调用工具

2023-6-14 22:47
7712

Android逆向时经常需要通过hook系统调用观察程序的行为,但使用seccomp很容易被目标程序检测。而eBPF是内核层面hook,用户态程序不可能能感知到,用于逆向时行为分析再合适不过了。在此之前也已经有教程教如何使用eBPF hook所有系统调用:60秒学会用eBPF-BCC hook系统调用 ( 2 ) hook安卓所有syscall。但是读下来发现,需要配置bcc环境、编写python代码,十分麻烦(我不相信真的60秒能学会)。

 

而我使用rust的aya框架,可以直接编译成一个单独的可执行程序,直接运行就可以hook所有系统调用了。同时借鉴了strace以及lurk等项目,将syscall执行以行日志形式输出,便于分析。

 

项目地址ri-char/eStrace

如何使用

Release中下载对应平台的二进制,直接运行即可。真的仅需60秒!

 

效果图:

 

原理

在eBPF中,使用TracePoint,分别挂载了两个函数在raw_syscalls/sys_enterraw_syscalls/sys_exit上,可以获取所有系统调用的事件。然后需要一张表来记录每一个系统调用有几个参数,每个参数的类型和名称,如果参数是指针的话,还需要记录指针指向结构体的大小,解引用的时机(有些指针作为系统调用的返回值)。详见:/ri-char/eStrace/cli/src/syscall_info/mod.rs

1
2
3
4
5
6
7
syscall!(read, fd = INT, buf = output_struct_ref(2), count = INT; ["DESC"]);
syscall!(write, fd = INT, buf = input_struct_ref(6), count = INT; ["DESC"]);
syscall!(open, filename = STR, flags = INT, flags = INT; ["DESC", "FILE"]);
syscall!(close, fd = INT; ["DESC"]);
syscall!(stat, filename=STR, statbuf = output_struct(sizeof!(stat)); ["FILE", "STAT", "STAT_LIKE"]);
syscall!(fstat, fd = INT, statbuf = output_struct(sizeof!(stat)); ["DESC", "FSTAT", "STAT_LIKE"]);
...

有了这样一张表,每个系统调用就去查表,将数据通过PerfEventArray传回用户态程序。用户态程序解析并将日志输出。

ToDo

  1. 上面这张系统调用的信息表可能存在错误
  2. 更加完整的过滤机制
  3. 参数结构体解析

希望有兴趣的小伙伴加入进来!


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2023-6-15 00:06 被ri_Char编辑 ,原因:
收藏
点赞11
打赏
分享
最新回复 (6)
雪    币: 19785
活跃值: (29397)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-6-15 09:21
2
1
mark
雪    币: 1112
活跃值: (2704)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Amun 2023-6-15 11:35
3
0
前后端都是 rust,好评!
雪    币: 32
活跃值: (1020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
twsxtd 2023-6-15 13:56
4
1
赞,之前用 aya 的时候就想复刻一个 estrace 的,用 rust 写真的太方便了。
雪    币: 1775
活跃值: (8919)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2023-6-15 15:26
5
0
大佬,更完整的过滤机制
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_阿伦_109 2023-6-16 10:54
6
0
大佬
雪    币: 6548
活跃值: (3769)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
juice4fun 1 2023-7-14 19:53
7
0
请问一下有打算添加syscall调用地址的记录吗, 我用bpf_task_pt_regs读寄存器显示call unknown, 不知道是不是5.10的内核版本低了, 看不到调用地址也太难受了
游客
登录 | 注册 方可回帖
返回