1

我正在编写一个小型内核驱动程序,它的作用是充当蜜罐并监视对系统上特定文件执行的操作。首先,我使用了这个存储库中的代码,然后为了简单起见,我对其进行了一些修改,使其仅适用于一个系统调用sys_open

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

总而言之,有没有办法可以给我隐式调用的进程的PID sys_open

4

1 回答 1

2

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

要获取当前进程的 UID、GID、EUID、EGID(等等),您可以使用linux/cred.h. 从相关内核文档页面

有用于检索任务凭据的特定方面的便利包装器(在每种情况下都简单地返回值):

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
/* ... */
于 2020-02-03T15:07:43.190 回答