如何获取调用系统函数的程序的进程ID

How to get the process ID of the program that called a system function

我正在编写一个小型内核驱动程序,它可以充当蜜罐并监视对系统上特定文件采取的操作。首先,I used the code in this repository,然后为了简单起见,我对其进行了轻微修改,使其仅适用于一个系统调用:sys_open

现在我需要收集 运行 该系统调用打开此文件的进程和用户的信息,但我找不到任何方法。我以为我可以使用文件描述符来识别哪个进程拥有它,但在与我的大学教授讨论后,他告诉我文件描述符不是系统范围内唯一的,而只是进程范围内的。

总而言之,有没有一种方法可以为我提供隐式调用 sys_open 的进程的 PID?

在内核代码中运行时,当前运行进程的信息存储在current全局变量中(它实际上是一个特定于平台的宏而不是全局变量,以准确地说),这是一个 struct task_struct。如果您在系统调用处理程序(或一个挂钩)中,那么 current 将是启动系统调用的进程,您只需检查 current->pid 即可获取其 PID。

要获取当前进程的 UID、GID、EUID、EGID(等等),您可以使用 linux/cred.h. From the relative kernel documentation page 中定义的一组宏:

There are convenience wrappers for retrieving specific aspects of a task’s credentials (the value is simply returned in each case):

uid_t current_uid(void)     // Current's real UID
gid_t current_gid(void)     // Current's real GID
uid_t current_euid(void)    // Current's effective UID
gid_t current_egid(void)    // Current's effective GID
/* ... */