Linux 关于信号处理程序中的非信号安全系统调用

Linux 关于信号处理程序中的非信号安全系统调用,linux,assembly,signals,x86-64,ptrace,Linux,Assembly,Signals,X86 64,Ptrace,我正在尝试使用ptrace在linux中实现CreateRemoteThread。 主要问题是mmap和clone系统调用不是信号安全的,因此直接注入它们是危险的 但是,如果我可以确保内核中没有挂起的mmap和克隆该进程的系统调用,该怎么办 比如说,, 首先,我附加目标进程的所有线程,并检查rip的前2个字节是否为0x0f 0x05(syscall)。 如果是,则从orig_rax reg获取系统调用号码,并检查它是9(mmap)还是56(克隆)。 如果是这样,我将rip中的地址设置为0xcc(

我正在尝试使用ptrace在linux中实现CreateRemoteThread。 主要问题是mmap和clone系统调用不是信号安全的,因此直接注入它们是危险的

但是,如果我可以确保内核中没有挂起的mmap和克隆该进程的系统调用,该怎么办

比如说,, 首先,我附加目标进程的所有线程,并检查rip的前2个字节是否为0x0f 0x05(syscall)。 如果是,则从orig_rax reg获取系统调用号码,并检查它是9(mmap)还是56(克隆)。 如果是这样,我将rip中的地址设置为0xcc(int3)并继续该线程。 当我从这些线程接收到SIGTRAP时,这些系统调用应该完成,并且在这个过程中不应该有未挂起的mmap和clone系统调用


现在使用mmap和克隆系统调用安全吗?

我确信所有实际的系统调用,包括
mmap
都可以从信号处理程序调用
mmap
不在POSIX列表中,因为它可能不是某些系统上的系统调用。检查操作码绝对是个坏主意。很可能会在你脸上爆炸。如果您想跟踪当前正在执行的系统调用,请检查
strace
是如何执行的,并复制方法。@fuz,您的意思是所有系统调用都是可重入的吗?所有系统调用都是可重入的。对于其中的一些,当系统调用阻塞进程时,当发送信号时,内核将中止系统并返回
EAGAIN
。然而,这对您来说确实很重要,因为您完全控制了流程,并且已经发送了信号(从而中断了任何可中断的系统调用)。一般来说,“异步信号安全”的全部内容更多地是关于libc功能和可移植性。可能不是其他系统上的系统调用并且可能需要访问共享状态的每个系统调用都不是异步信号安全的。(您不能在那里确切地使用锁,因为进程在信号处理程序运行时被挂起)它可能在某个地方有文档记录,但这基本上就是它在所有类UNIX系统上的工作方式。你不能通过并发系统调用来破坏内核。我确信所有实际的系统调用,包括
mmap
,都可以从信号处理程序中调用
mmap
不在POSIX列表中,因为它可能不是某些系统上的系统调用。检查操作码绝对是个坏主意。很可能会在你脸上爆炸。如果您想跟踪当前正在执行的系统调用,请检查
strace
是如何执行的,并复制方法。@fuz,您的意思是所有系统调用都是可重入的吗?所有系统调用都是可重入的。对于其中的一些,当系统调用阻塞进程时,当发送信号时,内核将中止系统并返回
EAGAIN
。然而,这对您来说确实很重要,因为您完全控制了流程,并且已经发送了信号(从而中断了任何可中断的系统调用)。一般来说,“异步信号安全”的全部内容更多地是关于libc功能和可移植性。可能不是其他系统上的系统调用并且可能需要访问共享状态的每个系统调用都不是异步信号安全的。(您不能在那里确切地使用锁,因为进程在信号处理程序运行时被挂起)它可能在某个地方有文档记录,但这基本上就是它在所有类UNIX系统上的工作方式。您不能通过执行并发系统调用来破坏内核。