首页
社区
课程
招聘
[原创]安卓seccomp-bpf使用
发表于: 2022-4-14 00:44 10922

[原创]安卓seccomp-bpf使用

2022-4-14 00:44
10922

seccomp-bpf是seccomp的拓展,通过配置sock_filter可以对系统调用进行拦截监控,理论上可以应用在指纹检测,拦截调用等方面

 

在使用seccomp前需要导入头文件filter.h、prctl.h、seccomp.h,定义sock_filter ,通过两个指令宏来完成规则的编写,整理了一下常用参数如下

 

BPF_LD将数据装入累加器,
BPF_ALU对累加器执行算术命令,
BPF_JMP是跳转指令,
BPF_RET是程序返回指令

1
2
3
4
5
6
7
8
9
10
    struct sock_filter filter[] = {
   //将帧的偏移0处,取4个字节数据,也就是系统调用号的值载入累加器
    BPF_STMT(BPF_LD+BPF_W+BPF_ABS,0),
   //首先JMP是跳转,JEQ是相等条件,如果与221相等则执行下一条规则
    BPF_JUMP(BPF_JMP+BPF_JEQ,221,0,1),
   //使用SECCOMP_RET_TRAP因为过滤器可捕获SIGSYS信号
    BPF_STMT(BPF_RET+BPF_K,SECCOMP_RET_TRAP),
    BPF_STMT(BPF_RET+BPF_K,SECCOMP_RET_ALLOW),
    };
//221在这里其实是系统调用号,在头文件unistd.h中查询,在64位execv就是221,例如openat为56

接下来定义 sock_fprog 结构体变量

1
2
3
4
5
6
struct sock_fprog prog = {
           4,     //指令条数
           filter,                                        
   };
   prctl(PR_SET_NO_NEW_PRIVS,1,0,0,0);//必要设置
   prctl(PR_SET_SECCOMP,SECCOMP_MODE_FILTER,&prog);

通过这两步,就可以对execve系统调用进行拦截,拦截后我们可以通过sigaction函数对信号进行处理

1
2
3
4
5
6
7
8
9
static void sig(int signum)
{
 
    if(signum == SIGSYS)
    {
        __android_log_print(4, "SIGUSR","execv");
    }
 
}
1
2
3
4
struct sigaction _execv;
_execv.sa_flags = 0;
_execv.sa_handler = sig;   //信号处理函数
sigaction(SIGSYS, &_execv, NULL);

当这些完成后,即可拦截系统调用并打印日志


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-6-8 18:08 被wx_白熊编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 0
活跃值: (633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬放个源码学习一下?
2022-12-5 11:03
0
游客
登录 | 注册 方可回帖
返回
//