- 论坛徽章:
- 1
|
本帖最后由 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/
他的代码是(不过他自己也说这段代码有问题):- int
- write_protect_pages(u32 addr, int npages)
- {
- pte_t pp, *ptep;
- pmd_t *pmd;
- pgd_t *pgd;
- int i;
- unsigned long flags;
- spin_lock_irqsave(&mktextro_lock, flags);
- for (i=0; i<npages; i++) {
- /* Get the 2nd level Page Table from Kernel Page Directory */
- pgd = pgd_offset_k(addr);
- /* Get to the 3rd level Page Table */
- pmd = pmd_offset(pgd, addr);
- /* Get the pointer to PTE */
- ptep = pte_offset_kernel(pmd, addr);
- /* Get the old protection for the page */
- pp = __pte(pte_val(*ptep));
- /* Disable writes to this page */
- pp = __pte(pte_val(*ptep) & ~(_PAGE_WRITE | _PAGE_SILENT_WRITE));
- set_pte(ptep, pp);
- local_flush_tlb_all();
- addr += PAGE_SIZE;
- }
- spin_unlock_irqrestore(&mktextro_lock, flags);
- return 0;
- }
复制代码 我参照一些代码,然后自己写了一段代码:- int set_page_rw(long unsigned int _addr)
- {
- struct page *pg;
- pte_t entry;
-
- pgprot_t prot;
- pg = virt_to_page(_addr);
- prot.pgprot = VM_READ | VM_WRITE | VM_EXEC ;
-
- entry = pte_mkwrite(pte_mkdirty(mk_pte(pg, prot)));
- }
复制代码 不过执行这段代码后,使用- if (!access_ok(VERIFY_WRITE, (void __user *) 0xc02c1b78, 20))
- {
- printk("hook not read\n");
- return -EFAULT;
- }
复制代码 仍然是不可写。
不知道大家有什么好的意见? |
|