【问题标题】:Way to get a pid of process that calls system call?获取调用系统调用的进程pid的方法?
【发布时间】:2013-04-10 16:41:45
【问题描述】:

我做了一个 kext 来使用我的系统调用而不是现有的系统调用来引用 Re-routing System Calls

在测试期间,我想知道哪个进程调用了这个系统调用。

我需要允许应用程序正常继续,但指定的进程除外。

有什么东西可以获取调用进程的信息吗?

【问题讨论】:

    标签: macos kernel kernel-extension


    【解决方案1】:

    如果您查看regular implementation of the ptrace system call 的源代码,您会发现它与struct proc 一起工作,该struct proc 表示作为第一个参数传入的调用进程:

    int
    ptrace(struct proc *p, struct ptrace_args *uap, int32_t *retval)
    {
        // …   
        if (uap->req == PT_DENY_ATTACH) {
            proc_lock(p);
            if (ISSET(p->p_lflag, P_LTRACED)) {
                proc_unlock(p);
                KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_FRCEXIT) | DBG_FUNC_NONE,
                              p->p_pid, W_EXITCODE(ENOTSUP, 0), 4, 0, 0);
                exit1(p, W_EXITCODE(ENOTSUP, 0), retval);
                /* drop funnel before we return */
                thread_exception_return();
                /* NOTREACHED */
            }
            SET(p->p_lflag, P_LNOATTACH);
            proc_unlock(p);
    
            return(0);
        }
    

    您可以使用<sys/proc.h> 中的函数来获取有关给定进程的信息,例如proc_pid 来查找pid。

    【讨论】:

    • 在这种情况下,您可能只需要致电proc_selfpid()
    • 实际上你是对的。从理论上讲,如果直接调用函数而不是作为来自用户进程的系统调用的结果,调用者可能会通过参数传递不同的进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多