Syscall劫持:如何传递参数?

时间:2019-08-21 18:27:59

标签: c linux-kernel kernel-module

我正在尝试注册新的hack syscall表的syscall。我可以将一个函数注册为syscall,并且可以正确调用它。但是,我无法传递参数。

我正在使用Linux ubuntu,内核版本5.0.0-25。

copy_from_user和copy_to_user不返回任何错误,而只是不复制数据。另外,仅传递一个值是行不通的,因为我是从内核端读取随机值的。

当前,我的实现如下:

unsigned long sys_call_table = 0xffffffffbb6001e0;
unsigned long sys_ni_syscall = 0xffffffffba6bd800;

asmlinkage int sys_my_first_sys_call(void){
    printk("%s: zero-params sys-call has been called\n",MODNAME);
    return 0;
}

asmlinkage int sys_my_second_sys_call(int a){
    printk("%s: 1-param sys-call has been called (with param %d)\n",MODNAME,a);
    return 0;
}

unsigned long new_sys_call_array[HACKED_ENTRIES] = {sys_my_first_sys_call,sys_my_second_sys_call};

int init_module(void) {

    unsigned long * p = (unsigned long *) sys_call_table;
    int i,j;
    int ret;

    unsigned long cr0;

    printk("%s: initializing\n",MODNAME);
    j = -1;
    for (i=0; i<256; i++){
        if (p[i] == sys_ni_syscall){
            printk("%s: table entry %d keeps address %p\n",MODNAME,i,(void*)p[i]);
            j++;
            restore[j] = i;
            if (j == (HACKED_ENTRIES-1)) break;
        }
    }

    cr0 = read_cr0();
        write_cr0(cr0 & ~X86_CR0_WP);
    for(i=0;i<HACKED_ENTRIES;i++){
        p[restore[i]] = (unsigned long)new_sys_call_array[i];
    }
    write_cr0(cr0);

    printk("%s: all new system-calls correctly installed on sys-call table \n",MODNAME);

    ret = 0;

    return ret;
}

用户空间,我通过以下方式调用sycall:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv){

    int sys_call_num, arg;

    if(argc < 2){ 
                printf("usage: prog syscall-num [syscall-param]\n");
                return;
        }


        sys_call_num = strtol(argv[1],NULL,10);
        if (argv[2]){
            arg = strtol(argv[2],NULL,10);
            syscall(sys_call_num,arg);
            return 0;
        }

    syscall(sys_call_num);

    return 0;
}

调用系统调用并将其传递给参数会导致打印随机值,如

1-param sys-call has been called (with param -1017053352)

有人知道为什么会这样吗?我不认为这是个错误...

2 个答案:

答案 0 :(得分:0)

  

我正在尝试注册新的hack syscall表的syscall。

这不是添加系统调用的受支持方法。它不能可靠或正确地工作。

如果要添加系统调用,请将其添加到内核本身,然后重新构建内核。有关详细信息,请参见“ Adding a New System Call”上的内核文档,但请特别关注描述“系统调用替代方案”的部分-有很多方法可以在不添加新系统调用的情况下向内核添加功能。

答案 1 :(得分:0)

sys_ni_syscall是无效的系统调用。 它定义为没有传入任何参数,因此您无法将参数传递到此系统调用sys_ni_syscall

当传入无效的系统电话号码时被调用。