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

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

2023-6-9 22:10
30913
收藏
免费 21
支持
分享
最新回复 (37)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
26
sigsys 不是不可靠信号吗,会不会引起 BAD SYSTEM CALL?
2024-7-7 17:50
0
雪    币: 26
活跃值: (427)
能力值: ( 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
雪    币: 705
活跃值: (974)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
pop_m 请教大佬一个问题,我用seccomp对openat进行了hook效果正常,但是同时也连发了好几个问题:1. 如果被hook进程有使用fork +  ...
我也遇到了这个问题,一直没找到解决方案,请教下大佬现在有合适的方案没
2025-2-14 00:03
0
雪    币: 26
活跃值: (427)
能力值: ( 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
雪    币: 26
活跃值: (427)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
mb_kgsesxqm 大佬,按照你的教程来,写好demo,拦截的是 __NR_openat 注入游戏(游戏没检测)会崩溃,报错:Process 8911 exited due to signal 31 (Bad sys ...
我也遇到了,请问有解决方案吗?感觉问题也不好找
2025-2-18 19:28
0
雪    币: 705
活跃值: (974)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31

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

最后于 2025-2-19 16:06 被sinker_编辑 ,原因:
2025-2-19 16:05
0
雪    币: 1107
活跃值: (671)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
32
pop_m 算是解决了吧,各种绕弯子,把fork exec的问题解决了,但是发现seccomp+sigaction这个方案整体上好像不是特别稳定,时不时会出现Zygote : Process 15927 exi ...
大佬现在解决了吗
2025-3-20 15:45
0
雪    币: 1107
活跃值: (671)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
33
pop_m 请教大佬一个问题,我用seccomp对openat进行了hook效果正常,但是同时也连发了好几个问题:1. 如果被hook进程有使用fork +  ...
其实只要clone不指定CLONE_SIGHAND就可能出现这种状况,但是去hook clone也在崩
2025-3-20 15:46
0
雪    币: 26
活跃值: (427)
能力值: ( 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
雪    币: 26
活跃值: (427)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
Golbeze 大佬现在解决了吗
不完美解决,详情可以看上条评论
2025-5-26 17:38
0
雪    币: 26
活跃值: (427)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回