Я пытаюсь добавить системный вызов в ядро linux (версия: 3.10.91), для которого требуются права root.Добавление нового системного вызова в Linux, для которого требуются привилегии root
Вы можете увидеть мою попытку ниже:
#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 просто задача описатель, который я добавил. В принципе, я хочу, чтобы процесс был скрытым (не видимым для ps, pstree, top и т. Д.), Когда значение casper равно 1. Ядро перекомпилирует 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;
}
я скомпилировать и запустить следующий образом:
НКА test
Суды ./ 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?
EDIT
Я добавил это: 351 i386 set_casper sys_set_casper к арки/x86/$ Gedit системных вызовов syscall_32.tbl
Однако моя система 64 бит. Это может быть проблема?
Возможно, ваш 'sys_set_casper' никогда не вызывается. Кстати, как вы регистрируете этот системный вызов? – Tsyvarev
Я добавляю подробное описание того, что я делал шаг за шагом. – SpiderRico
У вашего ядра, вероятно, нет syscall с номером 351. В зависимости от архитектуры вам нужно будет добавить запись в определенный файл. Для 'arm' это находится в' arch/arm/kernel/calls.S'. –