检测Linux内核空间中的进程创建

icd*_*ppl 5 c module process linux-kernel

我正在编写一个监视正在运行的进程的 Linux 模块,并且希望在创建新进程时收到通知。

我一直在研究,我了解到可以读取/proc/some-id来获取进程信息,但 inotify 不会报告 /proc 的更改,因为它是一个虚拟文件系统。它仅在阅读时提供信息。

以下是我的发现,以防有人也试图解决类似的问题:

1. pnotify(进程通知)

链接: http: //lwn.net/Articles/153187/这是最接近我想做的事情,但是它是在 2005 年发布的,似乎没有进入 Linux 发行版。这个想法是让 pnotify 与 inotify 相邻,并为进程监控提供类似的支持。

2.过程连接器

这个解决方案实际上是用户空间的。它使用 PF_NETLINK 与任何新创建的进程的内核进行通信。

3.扫描task_struct

与 2 类似,但此解决方案使用以下命令扫描内核中的任务列表以查找新进程

for_each_task(task) 
Run Code Online (Sandbox Code Playgroud)

proc 信息写入字符设备。用户空间应用程序将通过读取字符设备来轮询新信息。

说实话,我仍然希望 linux 有一些像 Windows 的PsSetCreateProcessNotifyRoutine一样的机制:-/

And*_*nle 4

实现 SE Linux 安全模块并使用在 上下文中调用的 .task_create 等挂钩fork(),或者在调用过程中的各个点调用的一个或多个 .bprm_* 挂钩execv()

看这里:

http://en.wikipedia.org/wiki/Linux_Security_Modules

和这里:

http://selinuxproject.org/page/NB_LSM

这里有一个例子:

http://lxr.free-electrons.com/source/security/selinux/hooks.c

您需要做的大部分事情只是一个传递,在钩子之外,您可以在fork()以下情况下将其用作通知:execv()调用

只要确保正确链接您的模块即可。