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

标签 c process module linux-kernel

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

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

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

<强>1。 pnotify(进程通知)

链接:http://lwn.net/Articles/153187/这是最接近我正在尝试做的事情,但是它是在 2005 年发布的,并且似乎没有进入 linux 发行版。这个想法是在 inotify 旁边有一个 pnotify,并为进程监控提供类似的支持。

<强>2。过程连接器

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

<强>3。扫描task_struct

类似于 2,除了此解决方案使用扫描内核中的任务列表以查找新进程

for_each_task(task) 

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

TBH,我仍然希望 linux 有一些类似于 Windows 的机制 PsSetCreateProcessNotifyRoutine :-/

最佳答案

实现 SE Linux 安全模块并使用 Hook ,例如在 fork() 的上下文中调用的 .task_create,或在以下位置调用的一个或多个 .bprm_* Hook 调用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

大部分你需要做的只是传递,在 Hook 之外,你可以在 fork()execv() 时用作通知打电话。

请务必正确链接您的模块。

关于c - 检测 Linux 内核空间中的进程创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708706/

相关文章:

c++ - 这段代码有什么用吗?

c - 无法匹配 C 中的正则表达式

javascript - Duktape - 在 C 中捕获错误

java - 当我只创建了两个线程时,为什么 `ps` 会列出 > 2 个 Java 线程/"light-weight processes"?

xcode - Swift 语言中的命名空间和模块

perl - 如何使用 cpanm 更新 perl 模块

c - 在n皇后回溯中使用clock()测量时间

windows - Closehandle() 不终止进程

java - 我如何解析 Ping 请求(字符串)的 Ping 时间(整数)?

javascript - 包含 Javascript 和连接的最佳实践