【发布时间】:2013-03-30 11:22:35
【问题描述】:
我正在编写一个内核模块,我需要劫持/包装一些系统调用。我正在暴力破解 sys_call_table 地址,并且我正在使用 cr0 禁用/启用页面保护。到目前为止一切顺利(一旦完成,我会公开整个代码,所以如果有人愿意,我可以更新这个问题)。
无论如何,我注意到如果我劫持__NR_sys_read,当我卸载内核模块时,我会收到内核错误,并且所有 konsoles (KDE) 都会崩溃。请注意,__NR_sys_open 或 __NR_sys_write 不会发生这种情况。
我想知道为什么会这样。有什么想法吗?
PS:请不要走 KProbes 的方式,我已经知道了,我不可能使用它,因为最终产品应该可以在无需重新编译整个内核的情况下使用。
编辑:(添加信息)
我在卸载前恢复了原来的功能。此外,我还创建了两个测试用例,一个仅使用_write,一个使用_read。带有_write 的那个可以正常卸载,但是带有_read 的那个会卸载然后导致内核崩溃。
编辑:(源代码)
我现在在家,所以我现在不能发布源代码,但是如果有人想要,我可以在我开始工作后立即发布示例代码。 (约 5 小时)
【问题讨论】:
-
卸载模块时是否恢复旧处理程序?
-
是的,我恢复它。 (我可以成功恢复所有 3 个,但 在恢复 _read 后失败)
标签: c linux kernel kernel-module system-calls