如何获取调用系统函数的程序的进程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
/* ... */
我正在编写一个小型内核驱动程序,它可以充当蜜罐并监视对系统上特定文件采取的操作。首先,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 /* ... */