我想从头开始创建一个内核模块,该模块锁定到用户会话并监视属于该用户的进程发出的每个系统调用。
我知道每个人都在想什么 - "使用 strace" - 但我想对我收集的数据进行一些自己的日志记录和分析,并且 strace 有一些问题 - 应用程序可以使用"mmap"写入文件,而文件内容永远不会显示为"打开"系统调用的参数,或者没有任何写入权限的应用程序可能会创建核心转储来复制敏感数据。
我希望能够处理这些特殊情况并执行一些自己的日志记录。我想知道 - 如何通过我的模块路由所有系统调用?有什么方法可以在不接触内核代码的情况下做到这一点吗?
谢谢
我没有你的问题的确切答案,但我几天前红了一篇论文,它可能对你有用:
http://www.cse.iitk.ac.in/users/moona/students/Y2157230.pdf/
我过去曾通过使用内核模块修补系统调用表来做类似的事情。每个修补的函数都执行以下操作:
patchFunction(/*params*/)
{
// pre checks
ret = origFunction(/*params*/);
// post checks
return ret;
}
请注意,当您开始在内核数据结构中乱搞时,您的模块将变得依赖于版本。内核模块可能必须针对您要安装的特定内核版本进行编译。
另请注意,这是许多 rootkit 采用的技术,因此如果您安装了安全软件,它可能会尝试阻止您执行此类操作。