首页
社区
课程
招聘
[原创]基于seccomp+sigaction的Android通用svc hook方案
发表于: 2023-6-9 22:10 32246

[原创]基于seccomp+sigaction的Android通用svc hook方案

2023-6-9 22:10
32246
收藏
免费 21
支持
分享
最新回复 (39)
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
26
sigsys 不是不可靠信号吗,会不会引起 BAD SYSTEM CALL?
2024-7-7 17:50
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27

请教大佬一个问题,我用seccomp对openat进行了hook效果正常,但是同时也连发了好几个问题:
1. 如果被hook进程有使用fork + exec,则会出现sigaction的handler将会找不到(exec会清除当前进程空间,加载另一个可执行程序,但seccomp规则依然保留且无法关闭),最终导致进程异常退出
2. 使用提前创建不受seccomp影响的白名单线程代处理的情况下,那么新进程将沿白名单调用clone处继续往下执行,而不会回到真正想调用clone的线程处开始执行。
请教大佬有没有更好的办法才能让我的seccomp进程支持fork+exec

最后于 2025-1-22 14:53 被pop_m编辑 ,原因:
2025-1-17 19:23
1
雪    币: 889
活跃值: (2582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
pop_m 请教大佬一个问题,我用seccomp对openat进行了hook效果正常,但是同时也连发了好几个问题:1. 如果被hook进程有使用fork +  ...
我也遇到了这个问题,一直没找到解决方案,请教下大佬现在有合适的方案没
2025-2-14 00:03
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
sinker_ 我也遇到了这个问题,一直没找到解决方案,请教下大佬现在有合适的方案没
算是解决了吧,各种绕弯子,把fork exec的问题解决了,但是发现seccomp+sigaction这个方案整体上好像不是特别稳定,时不时会出现Zygote  : Process 15927 exited due to signal 31 (Bad system call)然后crash掉,目前还在看,等解决了这个不稳定问题我在发一篇文章说一下整体的方案
2025-2-18 19:26
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
mb_kgsesxqm 大佬,按照你的教程来,写好demo,拦截的是 __NR_openat 注入游戏(游戏没检测)会崩溃,报错:Process 8911 exited due to signal 31 (Bad sys ...
我也遇到了,请问有解决方案吗?感觉问题也不好找
2025-2-18 19:28
0
雪    币: 889
活跃值: (2582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31

好的,期待大佬的方案和文章

最后于 2025-2-19 16:06 被sinker_编辑 ,原因:
2025-2-19 16:05
0
雪    币: 1107
活跃值: (681)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
32
pop_m 算是解决了吧,各种绕弯子,把fork exec的问题解决了,但是发现seccomp+sigaction这个方案整体上好像不是特别稳定,时不时会出现Zygote : Process 15927 exi ...
大佬现在解决了吗
2025-3-20 15:45
0
雪    币: 1107
活跃值: (681)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
33
pop_m 请教大佬一个问题,我用seccomp对openat进行了hook效果正常,但是同时也连发了好几个问题:1. 如果被hook进程有使用fork +  ...
其实只要clone不指定CLONE_SIGHAND就可能出现这种状况,但是去hook clone也在崩
2025-3-20 15:46
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
sinker_ 好的,期待大佬的方案和文章

文章没写完,说下大概原理吧,主要是修复了上面说的第二点:
hook fork,让其实现为向当前线程发送一个信号(我实现的是sigsys,通过设置x2为特殊值来区分普通kill调用和被hook了的fork),在sigaction里面判断如果为fork调用过来的,就将其上下文保存至全局变量,并发自定义消息送至白名单线程,自己阻塞等待(这里使用了条件变量和互斥锁),白名单线程收到消息后调用原始的fork,调用结束之后将返回值设置全局变量并通知调用线程拿结果,阻塞线程收到消息之后取消阻塞、拿结果、返回白名单线程调用fork的返回值(子进程pid),此时父进程的实现结束。
子进程(由于是白名单线程创建的,所以不会有sccomp约束,但会有刚才存储好的全局上下文)需要通过信号(sigaction)机制恢复上下文:开启一个自定义信号(我用的是siguser),其handler实现有两步:1. 将自定义信号恢复为默认值(也就是该信号只用一次);2. 将上下文信息(ucontext_t)覆盖为存储好的全局上下文信息,那么该信号函数处理完成之后子进程的执行流会跳到最初调用fork的位置,子进程的实现结束。
稳定性没有专门测,小米手机上完美跑通。流程较为负责,应该是存在稳定性问题,希望大家一起优化。最终文档和demo等我闲了再出

最后于 2025-5-26 17:35 被pop_m编辑 ,原因:
2025-5-26 17:35
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
Golbeze 大佬现在解决了吗
不完美解决,详情可以看上条评论
2025-5-26 17:38
0
雪    币: 34
活跃值: (522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
Golbeze 其实只要clone不指定CLONE_SIGHAND就可能出现这种状况,但是去hook clone也在崩
hook clone崩悄无声息,果断放弃
2025-5-26 17:39
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
37
pop_m sinker_ 好的,期待大佬的方案和文章 文章没写完,说下大概原理吧,主要是修复了上面说的第二点:hook  ...
大佬,我也遇到fork31问题了,能出个教程修复吗
2025-6-9 14:08
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
38
大佬们,seccomp+sigaction的svc hook方案在mumu等模拟器上有方案吗?尝试使用上面的代码在模拟器上有问题,寄存器数据都是空的,拿不到参数数据
2025-8-1 15:34
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
39
pop_m sinker_ 好的,期待大佬的方案和文章 文章没写完,说下大概原理吧,主要是修复了上面说的第二点:hook  ...

大佬   我按照上面代码集成apk运行后 要么就不停重启 bad systemcall  要么就卡在那  信号处理程序也进不去  代码哪里有问题吗
 struct sock_filter filter[] = {
            BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct seccomp_data, nr)),//读取系统调用号
            BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, __NR_openat, 0, 1), //判断是否等于__NR_openat
            BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_TRAP), //若是,则触发SECCOMP_RET_TRAP信号
            BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW), //若否,则通过。
    };
    struct sock_fprog prog;
    prog.filter = filter;
    prog.len = (unsigned short) (sizeof(filter) / sizeof(filter[0]));

    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
        perror("prctl(PR_SET_NO_NEW_PRIVS)");
        return 1;
    }
    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) == -1) {
        perror("when setting seccomp filter");
        return 1;

    }
    
    struct sigaction sa;
    sigset_t sigset;
    sigfillset(&sigset);

    sa.sa_sigaction = sig_handler;
    sa.sa_mask = sigset;
    sa.sa_flags = SA_SIGINFO;

    if (sigaction(SIGSYS, &sa, NULL) == -1) {
        LOGE("sigaction init failed.\n");
        return 1;
    }
  

最后于 2025-9-9 20:40 被mb_rcvipuuv编辑 ,原因:
2025-9-9 20:39
0
游客
登录 | 注册 方可回帖
返回