向Linux添加需要root权限的新系统调用

时间:2015-10-25 22:28:49

标签: c linux linux-kernel

我正在尝试将系统调用添加到需要root权限才能运行的linux内核(版本:3.10.91)。

您可以在下面看到我的尝试:

#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/sched.h>
#include <asm/current.h>
#include <asm/errno.h>

asmlinkage long sys_set_casper(pid_t pid, int value)
{
    struct task_struct *process;

    if (!capable(CAP_SYS_ADMIN))
        return -EPERM;

    //valid values are 0,1,2,3
    if (value != 0 && value != 1 && value != 2 && value != 3 )
        return -EINVAL;

    process = find_task_by_vpid(pid);
    if (process == NULL)
        return -ESRCH;

    //modify the casper field accordingly   
    process->casper = value;
    return 0;   
}

Casper只是我添加的任务描述符。基本上,当casper值为1时,我希望隐藏进程(ps,pstree,top等不可见)。内核重新编译jut fine(我也在base.c中进行了必要的更改等)。

我尝试使用以下代码测试我的系统调用:test.c:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define NR_set_casper 351

int main(int argc, char **argv)
{
    long y;
    printf("PID of current process: %d\n\n", getpid());

    printf("Call set_casper system call to set flag 1\n");
    y = syscall(NR_set_casper, getpid(), 0);
    printf("Return value of set_casper system call: %ld\n", y);
    if (y < 0)
    {
        printf("set_casper system call failed. Run with sudo\n");
        return EXIT_FAILURE;
    }

    return 0;
}

我编译并运行如下:

  

gcc test.c

     

sudo ./a.out

输出结果为:

PID of current process: 3852

Call set_casper system call to set flag 1
Return value of set_casper system call: -1
set_casper system call failed. Run with sudo

奇怪的是,即使删除了sudo控制线:

 if (!capable(CAP_SYS_ADMIN))
        return -EPERM;

并重新编译内核,我仍然遇到同样的错误。

基本上,为什么我的sys_set_casper函数返回-1?

修改

我添加了这个:351 i386 set_casper sys_set_casper to arch / x86 / syscalls $ gedit syscall_32.tbl

但是,我的系统是64位。这可能是问题吗?

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中所说,问题是我根本没有打电话给系统。我只是将我的调用添加到64位系统调用表中并再次尝试了所有操作。它可以工作。