我目前正在开发一个简单的内核模块,它可以窃取系统调用,例如open
,read
,write
,并用一个简单的函数替换它们,该函数记录正在打开的文件,读取,写入文件并返回原始系统调用。
我的查询是,我能够在read
和write
系统调用中获取文件描述符,但我无法理解如何使用相同的文件名获取文件名。
目前,我可以使用以下代码访问与给定FD相关联的文件结构:
struct file *file;
file = fcheck(fd);
这个文件结构中有两个重要的实体,我相信这是我所关注的:
f_path
f_inode
有人可以使用与之关联的文件结构帮助我获取dentry
或inode
或与此fd关联的路径名吗?
我的方法是否正确?或者我需要做一些不同的事情吗?
我正在使用Ubuntu 14.04,我的内核版本是3.19.0-25-generic,用于内核模块开发。
答案 0 :(得分:1)
.f_inode
实际上是一个inode。
.f_path->dentry
是一种谴责。
通过->d_parent
链接遍历此dentry,直到触及f_path.mnt.mnt_root
dentry,并收集dentry->d_name
个组件,将构建相对于挂载点的文件路径。这是通过例如d_path完成的,但是要更加谨慎。
除了应在RCU阅读部分中使用的fcheck(fd)
,您还可以使用fget(fd)
,而fput()
应与macdeployqt
配对。
答案 1 :(得分:0)
该方法完全不正确 - 请参阅http://www.watson.org/~robert/2007woot/
Linux已经有了一个可靠的机制来做这件事(审计)。如果你想要实现它(为了我假设的乐趣),你想把你的钩子大致放在审计所做的地方。机会是LSM钩子在适当的地方,没有检查。