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

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

2023-6-14 22:47
8660

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. 参数结构体解析

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-6-15 00:06 被ri_Char编辑 ,原因:
收藏
免费 11
支持
分享
最新回复 (6)
雪    币: 3004
活跃值: (30866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2023-6-15 09:21
1
雪    币: 1110
活跃值: (3244)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
前后端都是 rust,好评!
2023-6-15 11:35
0
雪    币: 12
活跃值: (1065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
赞,之前用 aya 的时候就想复刻一个 estrace 的,用 rust 写真的太方便了。
2023-6-15 13:56
1
雪    币: 2328
活跃值: (10364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大佬,更完整的过滤机制
2023-6-15 15:26
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
大佬
2023-6-16 10:54
0
雪    币: 7357
活跃值: (4484)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
请问一下有打算添加syscall调用地址的记录吗, 我用bpf_task_pt_regs读寄存器显示call unknown, 不知道是不是5.10的内核版本低了, 看不到调用地址也太难受了
2023-7-14 19:53
0
游客
登录 | 注册 方可回帖
返回
//