第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Linux內(nèi)核:系統(tǒng)調用掛鉤示例

Linux內(nèi)核:系統(tǒng)調用掛鉤示例

森林海 2019-10-14 15:28:46
我正在嘗試編寫一些簡單的測試代碼,以作為鉤住系統(tǒng)調用表的演示?!?sys_call_table”在2.6中不再導出,因此我只是從System.map文件中獲取地址,我可以看到它是正確的(在內(nèi)存中查找我找到的地址,我可以看到指向該地址的指針系統(tǒng)調用)。但是,當我嘗試修改該表時,內(nèi)核會給“ Oops”加上“無法處理虛擬地址c061e4f4上的內(nèi)核頁面調度請求”,然后機器會重新啟動。這是運行2.6.18-164.10.1.el5的CentOS 5.4。有某種保護措施還是我只有一個bug?我知道SELinux附帶了它,我已經(jīng)嘗試過將其設置為寬松模式,但這并沒有什么不同這是我的代碼:#include <linux/kernel.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/unistd.h>void **sys_call_table;asmlinkage int (*original_call) (const char*, int, int);asmlinkage int our_sys_open(const char* file, int flags, int mode){   printk("A file was opened\n");   return original_call(file, flags, mode);}int init_module(){    // sys_call_table address in System.map    sys_call_table = (void*)0xc061e4e0;    original_call = sys_call_table[__NR_open];    // Hook: Crashes here    sys_call_table[__NR_open] = our_sys_open;}void cleanup_module(){   // Restore the original call   sys_call_table[__NR_open] = original_call;}
查看完整描述

3 回答

?
冉冉說

TA貢獻1877條經(jīng)驗 獲得超1個贊

我遇到了一些問題,因為我在2.6.32內(nèi)核上進行了嘗試,WARNING: at arch/x86/mm/pageattr.c:877 change_page_attr_set_clr+0x343/0x530() (Not tainted)隨后出現(xiàn)了內(nèi)核OOPS,因為它們無法寫入內(nèi)存地址。


上述行上方的注釋指出:


// People should not be passing in unaligned addresses

以下修改的代碼有效:


int set_page_rw(long unsigned int _addr)

{

? ? return set_memory_rw(PAGE_ALIGN(_addr) - PAGE_SIZE, 1);

}


int set_page_ro(long unsigned int _addr)

{

? ? return set_memory_ro(PAGE_ALIGN(_addr) - PAGE_SIZE, 1);

}

請注意,在某些情況下,這實際上仍未將頁面設置為讀/寫。在static_protections()內(nèi)部調用的函數(shù)會在以下情況下set_memory_rw()刪除_PAGE_RW標志:


在BIOS區(qū)域

地址在.rodata內(nèi)部

設置CONFIG_DEBUG_RODATA且將內(nèi)核設置為只讀

我在調試后發(fā)現(xiàn)了這個問題,為什么在嘗試修改內(nèi)核函數(shù)的地址時仍然出現(xiàn)“無法處理內(nèi)核分頁請求”。最終,我可以自己找到地址的頁表條目并將其手動設置為可寫,從而解決了該問題。值得慶幸的是,該lookup_address()功能已在2.6.26+版本中導出。這是我為此編寫的代碼:


void set_addr_rw(unsigned long addr) {


? ? unsigned int level;

? ? pte_t *pte = lookup_address(addr, &level);


? ? if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW;


}


void set_addr_ro(unsigned long addr) {


? ? unsigned int level;

? ? pte_t *pte = lookup_address(addr, &level);


? ? pte->pte = pte->pte &~_PAGE_RW;


}

最后,雖然Mark的答案在技術上是正確的,但在Xen中運行時會遇到問題。如果要禁用寫保護,請使用讀/寫cr0功能。我像這樣宏化它們:


#define GPF_DISABLE write_cr0(read_cr0() & (~ 0x10000))

#define GPF_ENABLE write_cr0(read_cr0() | 0x10000)

希望這對遇到這個問題的其他人有所幫助。


查看完整回答
反對 回復 2019-10-14
?
臨摹微笑

TA貢獻1982條經(jīng)驗 獲得超2個贊

請注意,以下內(nèi)容也可以代替使用change_page_attr起作用,并且不能折舊:


static void disable_page_protection(void) {


    unsigned long value;

    asm volatile("mov %%cr0,%0" : "=r" (value));

    if (value & 0x00010000) {

            value &= ~0x00010000;

            asm volatile("mov %0,%%cr0": : "r" (value));

    }

}


static void enable_page_protection(void) {


    unsigned long value;

    asm volatile("mov %%cr0,%0" : "=r" (value));

    if (!(value & 0x00010000)) {

            value |= 0x00010000;

            asm volatile("mov %0,%%cr0": : "r" (value));

    }

}


查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 887 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號