- 論壇徽章:
- 1
|
本帖最后由 wsgtrsys 于 2013-08-18 19:26 編輯
因?yàn)樾枰獙?duì)內(nèi)核中的一個(gè)函數(shù)劫持后,修改其中的一個(gè)變量 。
是參考這個(gè)篇文章的的做法。
http://jan.stancek.eu/mips_function_runtime_detour
原來(lái)曾經(jīng)在2.6.16的內(nèi)核上劫持成功,但最近在2.6.35的內(nèi)核上就不行了。
2.6.35內(nèi)核的代碼部分仿佛是只讀的,不能修改原來(lái)的函數(shù)的機(jī)器碼。
有兩個(gè)問(wèn)題:
1、mips上是不是有類(lèi)似于x86上的cr0寄存器?
2、如果不是用cr0進(jìn)行保護(hù),是不是用tlb中的D bit 位置非零的方法使代碼段只讀?
于是google查到使代碼段可寫(xiě)的文章,找到這篇文章:
http://www.linuxquestions.org/qu ... iver-module-769705/
他的代碼是(不過(guò)他自己也說(shuō)這段代碼有問(wèn)題):- 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;
- }
復(fù)制代碼 我參照一些代碼,然后自己寫(xiě)了一段代碼:- 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)));
- }
復(fù)制代碼 不過(guò)執(zhí)行這段代碼后,使用- if (!access_ok(VERIFY_WRITE, (void __user *) 0xc02c1b78, 20))
- {
- printk("hook not read\n");
- return -EFAULT;
- }
復(fù)制代碼 仍然是不可寫(xiě)。
不知道大家有什么好的意見(jiàn)? |
|