我试图添加一个系统调用到需要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很好(我还在base.c中做了必要的修改等)。
我试着用下面的代码test.c来testing我的系统调用:
Windows模仿:软膏中的一个缺陷
将Perl正则expression式转换为等价的ECMAScript正则expression式
睡眠函数在c,unix中
Bluez BLE连接Linux
#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: %dnn",getpid()); printf("Call set_casper system call to set flag 1n"); y = syscall(NR_set_casper,getpid(),0); printf("Return value of set_casper system call: %ldn",y); if (y < 0) { printf("set_casper system call Failed. Run with sudon"); 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位的。 这可能是问题吗?
如何检测是否安装了MysqL?
在不调用read()的情况下确定pipe道的大小
静态编译libcurl应用程序linux C(缺less库)
您使用Windows的哪些logging工具?
在libpcap编译过程中发生冲突
正如其他人在评论中所说的那样,问题是我根本没有打电话给系统调用。 我只是把我的电话添加到64位系统调用表,并再次尝试一切,它的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。