在Linux中劫持实时时钟

16

我想编写一个Linux内核模块(LKM),以劫持实时时钟(中断8)。因此,我希望将中断设置为我的函数,并在某个时刻将其发送回旧函数。

我尝试使用request_irq函数,但没有成功,可能是因为内核函数不愿共享中断(我猜这是一个好的决定)。
我还尝试编辑中断描述表(IDT),根据我找到的一些页面。它们都不能正常工作,大多数甚至不能编译,因为它们是针对2.6内核编写的,而我正在使用3.10。

这是一个简化的代码,只是为了让您了解我的做法。

kpage =__get_free_page( GFP_KERNEL);
asm("sidt %0": : "m"(*idtr) : );
memcpy(kpage, idtr, 256*sizeof(kpage));
newidt = (unsigned long long *)(*(unsigned long*)(idtr+1));
newidt[8] = &my_function;
asm("lidt %0": "=m"(newidt):);

我的所有尝试要么以Segmentation fault(分段错误)的好结果告终,要么在内核崩溃的坏情况下强制我重新启动电脑(幸运的是我使用虚拟机和快照)。

那么我该如何劫持实时中断以执行自己的代码?(然后将其发送回原始函数以执行。)

这里 有一些很好的代码可以更改IDT上的pagefault函数。由于它也是针对2.6内核编写的,所以我无法使其正常工作。这个问题也值得关注。

为了获得悬赏,请发布可行的代码,或者至少提供足够的信息来运行它。


在Linux中,您根本没有中断访问权限。尝试找到一个合适的系统调用以便访问时钟,或者使用ptrace命令跟踪日期命令。这应该会有所帮助。 - icbytes
2
你是什么意思?如果是这样,IDT是什么? - Ramzi Khahil
6
由于原帖作者正在编写内核模块,所以他可以访问中断。 - nos
4
这感觉像是 XY 问题 的一个例子。你为什么认为需要这样做?可能有更好的方法来实现你更大的目标。 - zwol
1
你可以查看内核如何进行中断管理并进行逆向工程。顺便说一下,补丁代码的链接已经失效了,但是谷歌缓存还有它。这是2003/4年的代码(32位内核,因为ASM都是32位)。 - egur
显示剩余7条评论
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接