注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

Linux内核代码段修改,需要设置一下cr0寄存器的读写保护位  

2012-04-24 10:35:02|  分类: linux相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前试着弄过一次syscall的替换隐藏文件的代码,那时好像内核2.6.1x 还是2x吧,在虚拟机测试的时候还是不需要设置这个cr0的读写保护位的。但后来系统升级内核好像到了2.6.3x那个的时候,那个cisco的vpn驱动的就不能正常工作了,就发现不能直接改代码段了,是会有读写保存的错误的。后来用来其他办法绕过去了,不用直接改代码段了。 但好像网上很多人还是需要直接改的,比如替换syscall等inline hook的时候,大多都是从windows带过来的陋习。听说像下面这样设置一下cr0,可以暂时去掉写保存,然后在恢复就可以了。我自己没测试过是不是这样就可以了,现在离开以前公司,不用linux了,不然可以在一起的cisco vpn驱动上面试试。谁测一下告诉我结果,呵呵


/**
* clear WP bit of CR0, and return the original value
*/
unsigned int clear_and_return_cr0 ( void )
{
    unsigned int cr0 = 0;
    unsigned int ret;

    asm volatile ( "movl %%cr0, %%eax"
               : "=a" ( cr0 )
                 );
    ret = cr0;

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

    asm volatile ( "movl %%eax, %%cr0"
               :
               : "a" ( cr0 )
                 );
    return ret;
}

/** set CR0 with new value
*
* @val : new value to set in cr0
*/
void setback_cr0 ( unsigned int val )
{
    asm volatile ( "movl %%eax, %%cr0"
               :
               : "a" ( val )
                 );
}

  评论这张
 
阅读(1125)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017