首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >劫持sys呼叫

劫持sys呼叫
EN

Stack Overflow用户
提问于 2013-04-08 11:37:21
回答 1查看 1.2K关注 0票数 3

我正在编写一个内核模块,我需要劫持/包装一些sys调用。我粗暴地强迫sys_call_table地址,我使用cr0来禁用/启用页面保护。到目前为止还不错(一旦代码完成,我就会公开整个代码,这样如果有人愿意,我就可以更新这个问题)。

无论如何,我已经注意到,如果我劫持__NR_sys_read,当我卸载内核模块时,我会得到一个内核oops,并且所有konsoles (KDE)崩溃。请注意,__NR_sys_open__NR_sys_write不会发生这种情况。

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

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

编辑:(添加信息)

我在卸载前恢复原来的功能。此外,我还创建了两个测试用例,一个只使用_write,另一个使用_read。有_write的那个可以很好地卸载,但是有_read的那个会卸载然后崩溃内核)。

编辑:(源代码)

我现在在家,所以我现在不能发布源代码,但是如果有人想要的话,我一到工作就可以发布一个示例代码。(~5小时)

EN

回答 1

Stack Overflow用户

发布于 2013-04-08 13:58:34

这可能是因为内核线程当前在read中--如果调用读钩子没有锁定模块,则无法安全卸载。

这就解释了"konsoles“(?)由于他们目前可能正在执行read syscall,因此正在崩溃,等待数据。当他们从实际的syscall返回时,他们将跳入您的函数所在的位置,从而导致问题。

卸载将是混乱的,但您需要首先删除钩子,然后等待所有调用退出钩子功能,然后卸载模块。

我最近一直在玩linux挂钩,但我绝不是一个内核大师,所以我认为如果这是离题的话。

PS: This technique可能比蛮横的sys_call_table更可靠。如果sys_close已经上钩的话,我所见过的强力技术往往会导致内核恐慌。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15878068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档