【问题标题】:How to add a syscall from a kernel module?如何从内核模块添加系统调用?
【发布时间】:2013-09-25 17:35:10
【问题描述】:

好的,我正在尝试从内核模块向我的 Linux 添加系统调用。 这是模块代码。

asmlinkage int my_syscall() {
    printk(KERN_INFO "AWESOME!\n");
    return 0;
}

int load() {
    unsigned long ** addr;
    unsigned long int i = START;

    printk(KERN_INFO "IN\n");

    while (i < END) {
        addr = (unsigned long **)i;
        if (addr[__NR_close] == (unsigned long *)sys_close) {
            break;
        }
        i += sizeof(void *);
    }

    if (i != END) {
        addr += __NR_vserver;
        struct page * p = virt_to_page(addr);
        unsigned long paddr = (unsigned long)page_address(p);
        set_memory_rw(paddr, 15);
        *addr = &my_syscall;
        set_memory_ro(paddr, 15);
    }

    return 0;
}

void unload() {
    printk(KERN_INFO "OUT\n");
}

module_init(load);
module_exit(unload);

所以我正在寻找sys_call_table,一旦找到它,我就会尝试覆盖未实现的系统调用(vserver)。 当我insmod 得到.ko 时,dmesg 是这样说的:

BUG: unable to handle kernel paging request at ffffffff81801bc0

0xffffffff81801bc0 实际上是我尝试写&amp;my_syscall 的地址。 我不知道我到底做错了什么,但我认为当我尝试写入时内存页面可能仍处于ro 模式...

【问题讨论】:

    标签: c linux kernel system-calls


    【解决方案1】:

    我不明白的是以下行:

    set_memory_rw(paddr, 15);
    

    这里应该发生什么?

    您不能更改物理地址的属性!

    也许下面的代码是正确的:

    set_memory_rw(addr, 15);
    

    (在这种情况下,您不需要物理地址“paddr”或页面“p”。)

    或者,您可以尝试在内核空间中再次映射物理地址。

    你应该在“unload()”函数中恢复原来的指针!!

    【讨论】:

      【解决方案2】:

      如果 0xffffffff81801bc0 是你传递给 set_memory_rw() 的实际地址,那么它肯定是错误的值。地址应该四舍五入到PAGE_MASK边界,即页面的起始地址,64位系统通常以4个零结尾。

      set_memory_rw() 使用内存页表的 U/S 位进行操作。但是 x86/amd64 CPU 还有另一个属性:WP 位(在 cr0 内)。根据 Intel 手册,WP 位会覆盖内存页表属性,即无论内存是否为只读,启用/禁用 WP 位仍然有效。但是WP位是per-cpu的,所以要小心同步你的内存访问,这样在改变内存内容的同时,另一个CPU不会读取它。 (对于您未使用的系统调用号,这应该没问题)。

      http://vulnfactory.org/blog/2011/08/12/wp-safe-or-not/

      【讨论】:

        【解决方案3】:

        看起来你在系统调用的实现中遗漏了一些东西。只需看看http://arvindsraj.wordpress.com/2012/10/05/adding-hello-world-system-call-to-linux/,它会逐步解释实现系统调用的过程,并检查您是否正确执行了所有步骤。

        【讨论】:

        • 这不是关于从模块添加系统调用。
        猜你喜欢
        • 2016-07-20
        • 2011-01-24
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 2013-04-25
        • 2018-09-15
        相关资源
        最近更新 更多