我正在尝试注册新的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)
有人知道为什么会这样吗?我不认为这是个错误...
答案 0 :(得分:0)
我正在尝试注册新的hack syscall表的syscall。
这不是添加系统调用的受支持方法。它不能可靠或正确地工作。
如果要添加系统调用,请将其添加到内核本身,然后重新构建内核。有关详细信息,请参见“ Adding a New System Call”上的内核文档,但请特别关注描述“系统调用替代方案”的部分-有很多方法可以在不添加新系统调用的情况下向内核添加功能。
答案 1 :(得分:0)
sys_ni_syscall是无效的系统调用。 它定义为没有传入任何参数,因此您无法将参数传递到此系统调用sys_ni_syscall
当传入无效的系统电话号码时被调用。