- 论坛徽章:
- 0
|
原帖由 Godbach 于 2009-8-4 04:46 发表 ![]()
刚刚看看了一少半PDF文档。请教一下白金兄是否按照上面的代码做过实验啊?
如果你的系统是 64 位的,照着做应该是没什么效果,因为大部分的用户程序都是 64 位的,glibc 相应地用 sysenter 而不是 int 0x80,而且搜索的签名也不对。已经2009年了,网上大都还在传抄 32 位的例子,sysenter 都不予考虑,貌似都是高校学生在应付作业 
内核2.6.21为例,arch/x86_64/kernel/setup64.c 中有 asm volatile("lidt %0" :: "m" (idt_descr)); 一句用来设置 IDT,之后调用syscall_init() 函数,syscall_init()里头调用 wrmsrl(MSR_LSTAR, system_call); 设置系统调用入口。所以我们需要相应地用 rdmsrl 读出 system_call 入口。
在 64 位下,要搜索的签名不再是 0xFF0x140x85,而是 0xFF0x140xC5 (对应 callq)。
还有就是,在较新的内核下,存有系统调用表的页是只读的,在 LKM 里面也不能写入,文档中的例子在 Fedora 9 下是不能工作的,两个选择,1. 找到该页的页表项,修改其属性,2. 简单地修改一下 cr0。
[ 本帖最后由 vupiggy 于 2009-8-4 15:37 编辑 ] |
|