在将数据写入硬盘之前,我想做一些事情。 我不知道任何解决scheme。 为了避免编辑内核源代码,有没有可以使用钩子函数作为可加载模块的位置?
更新:谢谢大家,LSM是API钩子。 但是我想find其他解决scheme,提供机制钩读/写数据块。 它可以避免更新文件后重新encryption所有文件。
我认为我可以在文件系统(ext2,ext3,…)和缓冲区caching之间进行修改。
为什么Windows挂钩不会收到某些消息?
如何inheritanceWindows资源pipe理器的窗口
如何在Windows中挂钩本地帐户创build?
在x64系统中SSDT挂钩的替代scheme
钩住Windows中的所有新进程和命令行参数
是否有LdrLoadDll的内核模式callback?
如何挂钩特定的Windows消息没有子类化?
C#挂钩Windows进程来检查debugging进程
Linux内核:系统调用挂钩的例子
使用Linux安全模块 。 这些是可加载的内核模块,提供钩子来调解对内核中各种内部对象的访问。 您可以根据需要使用钩子到文件系统或inode。 开始的一个上帝的地方是阅读Greg Kroah Hartman关于LSM的论文 。 然后你可以访问这个链接 ,在那里显示如何使用LSM挂钩的例子。 这个例子只有当插入一个特定的USB时才能调解对系统的访问,并且是一个很好的参考点,就如何开始LSM挂钩。
那么这是一个有趣的问题。
不幸的是,即使是LSM在这里也没有帮助。 作为一个可能的解决方案,我会建议使用address_space_operations表和钩子writepage函数。 例如,看看ext3_writeback_aops :
1984 static const struct address_space_operations ext3_writeback_aops = { 1985 .readpage = ext3_readpage,1986 .readpages = ext3_readpages,1987 .writepage = ext3_writeback_writepage,1988 .write_begin = ext3_write_begin,1989 .write_end = ext3_writeback_write_end,1990 .bmap = ext3_bmap,1991 .invalidatepage = ext3_invalidatepage,1992 .releasepage = ext3_releasepage,1993 .direct_IO = ext3_direct_IO,1994 .migratepage = buffer_migrate_page,1995 .is_partially_uptodate = block_is_partially_uptodate,1996 .error_remove_page = generic_error_remove_page,1997 };
所以,在ext3文件系统的情况下,我们需要在内存中找到这个结构体,并将writepage指针替换为指向我们的our_writepage包装器。 还要注意,这个表是在只读内存中,你需要正确处理它。
编辑:
使用LSM,可以挂接inode打开操作,并替换inode->i_mapping->a_ops 。
试试FUSE ( https://github.com/libfuse/libfuse )。
这是用户空间中的文件系统。 您可以在用户空间中编写文件I / O处理程序,并将其作为应用程序的执行进行简单安装。
我不认为这是可能的。 当用户空间调用文件I / O时,文件系统实现或通用实现将从VFS调用。 你需要的是将这个函数指针改为指向你的模块,这个模块加密你的数据,然后调用文件系统函数。
我在大学做了这样的事情,但是它是一个老内核,你必须设置一个特定的配置标志。 如果我记得这个标志已经消失了,因为你不想让内核模块乱用它们范围之外的函数指针。
无论如何,你可以在这里找到这个模块: https : //motzblog.wordpress.com/2007/10/27/linux-monitoring-module/
但要注意的是,这是一个大学项目,所以代码质量不是你从Linux内核代码中除外的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。