求助:x86_64上面的cr0清零的问题

发布于 2022-10-15 08:15:32 字数 3151 浏览 24 评论 0

{:3_198:} 系统是Linux localhost.localdomain 2.6.18-164.el5xen #1 SMP Tue Aug 18 15:59:52 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

通过网上查到拦截系统调用的方法,在获取系统调用表前先对cr0进行清零操作,就是如下:

  1. unsigned int clear_and_return_cr0(void)   
  2. {   
  3.         unsigned long cr0 = 0;   
  4.         unsigned long ret;   
  5.         asm volatile ("movq %%cr0, %%rax"   
  6.                 : "=a"(cr0)   
  7.                 );   
  8.         ret = cr0;   
  9.         /* clear the 20 bit of CR0, a.k.a WP bit */   
  10.         cr0 &= 0xfffffffffffeffff;   
  11.         asm volatile ("movq %%rax, %%cr0"   
  12.                 :   
  13.         : "a"(cr0)   
  14.                 );    ///就这句!!!
  15.         return ret;   
  16. }   

复制代码insmod后,系统就重启了。。。
入口函数如下

  1. static int init_sys_call_table(void)   
  2. {   
  3.         int nRet=0;
  4.         printk("<1>: ********************Just enter the myinit()...\n");
  5.        
  6.         unsigned long orig_cr0 = clear_and_return_cr0();   
  7. /*        sys_table = (unsigned long *) get_syscall_table_long();   
  8.         sys_table = (unsigned long)sys_table | 0xffffffff00000000;   
  9.         if (sys_table == 0){   
  10.                 printk("sys_table == 0\n");   
  11.                 return -1;   
  12.         }
  13. */
  14.         setback_cr0(orig_cr0);   
  15.        
  16.         printk( KERN_ALERT"the sys table  is %x\n",sys_table );
  17.         return 0;   
  18. }   
  19. 经过加log验证,问题是出在asm volatile ("movq %%rax, %%cr0"   
  20.                 :   
  21.         : "a"(cr0)   
  22.                 );   
  23. 这句上,这句注释了,就能正常加载了,但注释后就达不到清0效果了

复制代码哪位大哥帮我看看啊,多多感谢啦

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

猛虎独行 2022-10-22 08:15:32

# asm volatile ("movq %%cr0, %%rax"   
#                 : "=a"(cr0)   
#                 );   

cr0只有32位在64位系统上,但是rax是64位的,所以应该先XOR 清空rax,再将cr0保存到rax中。

南风起 2022-10-22 08:15:32

static inline u64 clear_and_return_cr0(void)
{
        u64 cr0 = 0;
        u64 ret;

        asm volatile ("movq %%cr0, %0"
                        : "=a"(cr0)
                     );
        ret = cr0;

        /* clear the 20 bit of CR0, a.k.a WP bit */
        cr0 &= ~0x10000LL;

        asm volatile ("movq %0, %%cr0"
                        :
                        : "a"(cr0)
                     );
        return ret;
}

执手闯天涯 2022-10-22 08:15:32

LS正解。LZ再把GCC内嵌汇编的语法好好看看吧。你的函数里只用了CR0, RAX寄存器,但是又搞个=A啥的,比较混乱

仄言 2022-10-22 08:15:32

提供一下我这边遇到的情况,查看是否内核后缀有xen支持。例如2.6.18-164.el5xen操作cr0会有问题,2.6.18-164.el5则可以操作cr0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文