我必须编写LKM,它拦截一些系统调用。 解决办法是:sys_call_table的符号的安全卸载内核模块
- 查找地址,检查是否地址是正确的(检查例如该sys_call_table的[__ NR_close]指向SYS_CLOSE的地址)
- 禁止中断在CR0
- 禁用WP位
- 变化sys_call_table的[__ NR_close]我自己的功能
- 启用WP位
- 允许中断。加载模块工作正常。
但是,模块的安全卸载呢?
考虑到我将sys_call_table恢复到原始状态并卸载模块的情况 - 如果内核仍在其他CPU的其他进程的系统调用上下文中执行代码,该怎么办?我会在内核模式下发生页面错误(因为模块代码段的页面不可用,因为模块已被卸载)。 共享资源是sys_call_table中的条目。如果我可以访问受锁定保护的条目 - 那么我可以安全地卸载我的模块。
但是,由于内核系统调用处理程序没有任何这种锁(例如/ x86/kernel/entry_32.S) - 这意味着没有安全的方式卸载我的模块?这是真的吗?
UPDATE1
我需要得到有关文件的信息访问旧内核(其中fanotify(2)不可用),从2.4内核版本开始。我需要这些信息才能通过防病毒引擎执行访问扫描。
你可能想弄清楚为什么你要首先拦截/挂钩系统调用。这里的人们会认为你要么解决XY问题,要么写恶意软件。 – tangrs