linux系统调用劫持无效参数

时间:2015-05-13 06:56:59

标签: linux-kernel system-calls

我使用这种方式重新定义了系统调用:

 long my_sys_munmap(unsigned long addr, size_t len)
 {
    PR_DBG("addr(%p) len(%lu)\n", (void *)addr, len);
    .........................


 static int my_make_page_rw(unsigned long addr)
 {
    unsigned int level;
    pte_t *pte = lookup_address(addr, &level);
    if(pte->pte &~ _PAGE_RW)
            pte->pte |= _PAGE_RW;
    return 0;
 }

 static int my_make_page_ro(unsigned long addr) 
 {
    unsigned int level;
    pte_t *pte = lookup_address(addr, &level);
    pte->pte = pte->pte &~ _PAGE_RW;
    return 0;
 }


void my_ioc_patch_munmap(void)
{
    my_make_page_rw((unsigned long)sys_call_table);
    orig_sys_munmap = sys_call_table[__NR_munmap];
    *(sys_call_table+__NR_munmap) = (void *)my_sys_munmap;
    my_make_page_ro((unsigned long)sys_call_table);
}

但之后我在my_sys_munmap中获得了以下跟踪线:

 addr(91) len(449989154)

这意味着第一个参数是系统调用的数量(91)。 my_sys_munmap的原型是什么?我无法得到合适的addr和len。

2 个答案:

答案 0 :(得分:0)

我忘记了asmlinkage指令

asmlinkage long my_sys_munmap( unsigned long addr, size_t len)

答案 1 :(得分:0)

这是什么内核?什么架构(i386?)?您是否尝试过拆卸正在替换的函数以查看它如何访问其参数?