Linux kernel linux系统调用劫持无效参数

Linux kernel linux系统调用劫持无效参数,linux-kernel,system-calls,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 =

我使用以下方法重新定义了系统调用:

 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);
}
但在这之后,我在我的系统地图中得到了以下跟踪线:

 addr(91) len(449989154)

这意味着第一个参数是系统调用数(91)。我的地图原型是什么?我找不到合适的地址和地址

我忘了带链接指令

asmlinkage long my_sys_munmap( unsigned long addr, size_t len)

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

x86 Linux 3.14.37#15 SMP,asmlinkage指令解决了此问题