3

我正在编写一个内核模块,我需要劫持/包装一些系统调用。我正在暴力破解 sys_call_table 地址,并且我正在使用 cr0 禁用/启用页面保护。到目前为止一切顺利(一旦完成,我将公开整个代码,所以如果有人愿意,我可以更新这个问题)。

无论如何,我注意到如果我__NR_sys_read在卸载内核模块时劫持了内核 oops,并且所有 konsoles (KDE) 都会崩溃。请注意,这不会发生在__NR_sys_openor__NR_sys_write中。

我想知道为什么会这样。有任何想法吗?

PS:请不要走 KProbes 的方式,我已经知道了,我不可能使用它,因为最终产品应该可以使用,而无需重新编译整个内核。

编辑:(添加信息)

我在卸载之前恢复了原始功能。另外,我创建了两个测试用例,一个_write只包含一个,一个包含_read. 一个_write卸载正常,但一个_read卸载然后崩溃内核)。

编辑:(源代码)

我现在在家,所以我现在不能发布源代码,但是如果有人想要,我可以在我开始工作后立即发布示例代码。(约 5 小时)

4

1 回答 1

5

这可能是因为内核线程当前位于内部read- 如果调用您的 read-hook 不会锁定模块,则无法安全卸载它。

这可以解释“konsoles”(?)崩溃,因为它们可能当前正在执行read系统调用,等待数据。当它们从实际的系统调用返回时,它们将跳转到您的函数曾经所在的位置,从而导致问题。

卸载会比较麻烦,但是需要先去掉钩子,然后等待所有调用者退出钩子函数,再卸载模块。

我最近一直在玩 linux syscall hooking,但我绝不是内核专家,所以如果这不正常,我很抱歉。

PS: 这种技术可能比暴力破解 sys_call_table 更可靠。sys_close如果已经上钩,我见过的蛮力技术往往会导致内核恐慌。

于 2013-04-08T13:58:34.473 回答