2.利用frida + seccomp方式,通过Process.setExceptionHandler来捕获SECCOMP_RET_TRAP信号,并且为了避免hook时死循环递归(hook函数中调用svc又再次被seccomp过滤发出SECCOMP_RET_TRAP信号),该项目通过创建新线程的方式来规避,但这种方式在处理多线程或者多进程任务时处理起来很麻烦。 本文的通用hook svc方法与第二种类似,主...
seccomp-bpf 是 seccomp 的一个扩展,它可以通过配置来允许应用程序调用其他的系统调用。 如何和frida结合 基本原理 seccomp的具体用法可以参考「什么是seccomp」中的seccomp介绍文章。当返回规则设置为「SECCOMP_RET_TRAP」,目标系统调用时seccomp会产生一个SIGSYS系统信号并软中断,这时就可以通过捕获这个SIGSYS信号获得svc...
SECCOMP_RET_ALLOW - 允许继续使用系统调用 SECCOMP_RET_KILL - 终止系统调用 SECCOMP_RET_ERRNO - 返回设置的errno值 SECCOMP_RET_TRACE - 通知附加的ptrace(如果存在) SECCOMP_RET_TRAP - 往进程发送 SIGSYS信号 最多只能有4096条命令 不能出现循环 Seccomp-BPF程序 接收以下结构作为输入参数: 代码语言:javascrip...
SECCOMP_RET_ALLOW:允许执行 SECCOMP_RET_KILL:立即终止执行 SECCOMP_RET_ERRNO:从系统调用中返回一个错误(系统调用不执行) SECCOMP_RET_TRACE:尝试通知ptrace(), 使之有机会获得控制权 SECCOMP_RET_TRAP:通知内核发送SIGSYS信号(系统调用不执行) 每一个seccomp-BPF程序都使用seccomp_data结构作为输入参数: /include/...
SECCOMP_RET_ALLOW - 允许继续使用系统调用 SECCOMP_RET_KILL - 终止系统调用 SECCOMP_RET_ERRNO - 返回设置的errno值 SECCOMP_RET_TRACE - 通知附加的ptrace(如果存在) SECCOMP_RET_TRAP - 往进程发送 SIGSYS信号 最多只能有4096条命令 不能出现循环
利用frida + seccomp方式,通过Process.setExceptionHandler来捕获SECCOMP_RET_TRAP信号,并且为了避免hook时死循环递归(hook函数中调用svc又再次被seccomp过滤发出SECCOMP_RET_TRAP信号),该项目通过创建新线程的方式来规避,但这种方式在处理多线程或者多进程任务时处理起来很麻烦。
将SECCOMP_RET_TRAP传入BPF指令中,当执行该指令时,将会产生SIGSYS信号。我们可以提前通过sigaction方法来注册SIGSYS信号,当捕获到信号时,会执行对应的handler方法。在正常情况下,都是可以正常接收到信号,并执行handler方法。但是如果该进程已经提前使用了Seccomp-BPF,将会无法正常接收到信号,handler方法也不会执行。所以可以...
SECCOMP_RET_TRAP: 发送一个可捕获的SIGSYS SECCOMP_RET_ERROR: 指定errno的值并返回 SECCOMP_RET_TRACE: 由被附加的ptrace tracer裁决 SECCOMP_RET_ALLOW: 允许这个系统调用继续 随着内核发展,返回值也在变化,5.17版本上已经有更多的返回值,可以参考内核文档。
seccomp的具体用法可以参考「什么是seccomp」中的seccomp介绍文章。当返回规则设置为「SECCOMP_RET_TRAP」,目标系统调用时seccomp会产生一个SIGSYS系统信号并软中断,这时就可以通过捕获这个SIGSYS信号获得svc调用和打印具体参数。 如何脚本化安装seccomp规则呢 这里使用Frida的API「CModule」,CModule提供强大的动态编译功能可...
SECCOMP_RET_TRAP:通知内核发送SIGSYS信号(系统调用不执行) 每一个seccomp-BPF程序都使用seccomp_data结构作为输入参数: /include/uapi/linux/seccomp.h: structseccomp_data{intnr;/* 系统调用号(依赖于体系架构) */__u32arch;/* 架构(如AUDIT_ARCH_X86_64) */__u64instruction_pointer;/* CPU指令指针 *...