免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1955 | 回复: 1

[内核模块] mips 内核函数inline hook 问题 [复制链接]

论坛徽章:
1
处女座
日期:2013-08-19 12:39:10
发表于 2013-08-18 19:19 |显示全部楼层
本帖最后由 wsgtrsys 于 2013-08-18 19:26 编辑

因为需要对内核中的一个函数劫持后,修改其中的一个变量 。
是参考这个篇文章的的做法。
http://jan.stancek.eu/mips_function_runtime_detour

原来曾经在2.6.16的内核上劫持成功,但最近在2.6.35的内核上就不行了。
2.6.35内核的代码部分仿佛是只读的,不能修改原来的函数的机器码。

有两个问题:
1、mips上是不是有类似于x86上的cr0寄存器?
2、如果不是用cr0进行保护,是不是用tlb中的D bit 位置非零的方法使代码段只读?

于是google查到使代码段可写的文章,找到这篇文章:
http://www.linuxquestions.org/qu ... iver-module-769705/
他的代码是(不过他自己也说这段代码有问题):
  1. int
  2. write_protect_pages(u32 addr, int npages)
  3. {
  4. pte_t pp, *ptep;
  5. pmd_t *pmd;
  6. pgd_t *pgd;
  7. int i;
  8. unsigned long flags;

  9. spin_lock_irqsave(&mktextro_lock, flags);

  10. for (i=0; i<npages; i++) {

  11. /* Get the 2nd level Page Table from Kernel Page Directory */
  12. pgd = pgd_offset_k(addr);

  13. /* Get to the 3rd level Page Table */
  14. pmd = pmd_offset(pgd, addr);

  15. /* Get the pointer to PTE */
  16. ptep = pte_offset_kernel(pmd, addr);

  17. /* Get the old protection for the page */
  18. pp = __pte(pte_val(*ptep));

  19. /* Disable writes to this page */
  20. pp = __pte(pte_val(*ptep) & ~(_PAGE_WRITE | _PAGE_SILENT_WRITE));

  21. set_pte(ptep, pp);

  22. local_flush_tlb_all();

  23. addr += PAGE_SIZE;
  24. }

  25. spin_unlock_irqrestore(&mktextro_lock, flags);

  26. return 0;
  27. }
复制代码
我参照一些代码,然后自己写了一段代码:
  1. int set_page_rw(long unsigned int _addr)
  2. {
  3.    struct page *pg;
  4.    pte_t entry;
  5.    
  6.    pgprot_t prot;
  7.    pg = virt_to_page(_addr);
  8.    prot.pgprot = VM_READ | VM_WRITE | VM_EXEC  ;
  9.    
  10.    entry =  pte_mkwrite(pte_mkdirty(mk_pte(pg, prot)));

  11. }
复制代码
不过执行这段代码后,使用
  1. if (!access_ok(VERIFY_WRITE, (void __user *) 0xc02c1b78, 20))
  2.         {
  3.                 printk("hook not read\n");
  4.                 return -EFAULT;
  5.         }
复制代码
仍然是不可写。
不知道大家有什么好的意见?

论坛徽章:
1
处女座
日期:2013-08-19 12:39:10
发表于 2013-08-19 11:00 |显示全部楼层
经过测试,代码段是可写的。
出现问题应该是hook和还原代码后的cache没有及时更新。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP