【问题标题】:How to get the process ID of the program that called a system function如何获取调用系统函数的程序的进程ID
【发布时间】:2020-05-19 08:27:44
【问题描述】:

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

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

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

【问题讨论】:

  • 也许你可以了解getpid系统调用是如何工作的。 getpid 必须能够知道进程 ID。

标签: c linux-kernel hook ftrace


【解决方案1】:

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

要获取当前进程的 UID、GID、EUID、EGID(等等),您可以使用linux/cred.h 中定义的宏集。来自relative kernel documentation page

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

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
/* ... */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2018-05-17
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多