2015-11-29 70 views
2

我目前正在开发一个简单的内核模块,它可以盗取系统调用,如openreadwrite并用一个简单的功能,日志文件被打开,读,写替换它们,放入一个文件并返回原始的系统调用。解决文件描述符文件名/文件路径

我的查询是,我能够在readwrite系统调用中获得文件描述符,但我无法理解如何使用相同的方法获取文件名。

目前我能够访问与使用给定的FD下面的代码相关联的文件结构:

struct file *file; 
file = fcheck(fd); 

该文件结构中有两个重要的实体,这是我关心的,我相信:

  1. f_path
  2. f_inode

任何人都可以帮我得到dentryinode或与此fd关联的路径名称使用与它相关联的文件结构? 我的方法是否正确?或者我需要做一些不同的事情?

我使用的是Ubuntu 14.04,我的内核版本是3.19.0-25-generic,用于内核模块开发。

回答

1

.f_inode实际上是一个inode。

.f_path->dentry是dentry。

通过->d_parent链接遍历此目录项,直到f_path.mnt.mnt_root目录项会被感动,并收集dentry->d_name组件,将构建该文件的路径,相对于挂载点。这是通过例如d_path完成的,但是以更谨慎的方式完成。

相反的fcheck(fd),里面RCU阅读部分应使用,也可以使用fget(fd),这应该与fput()配对。

0

的方法是完全不正确 - 见http://www.watson.org/~robert/2007woot/

的Linux已经为做这件事(审计)的可靠机制。如果你想实现它(为了好玩,我假设),你想要把你的钩子大致放在审计正在做的地方。机会是LSM挂钩在适当的地方,没有检查。