我有兴趣通过劫持系统调用来修改Linux以达到我自己的目的。我成功地劫持了open()
,ioctl()
以及用于操纵扩展属性的系统调用。我试图用{:1>劫持execve()
asmlinkage int (*real_execve)(const char __user *,
const char __user *const __user *,
const char __user *const __user *);
asmlinkage int hijacked_execve(const char __user *filename,
const char __user *const __user *argv,
const char __user *const __user *envp) {
return real_execve(filename, argv, envp);
}
modifying the system call table。插入内核模块后,终端就会挂起。如果我输入一个命令然后按回车键,终端就像一个文本编辑器,它不会接受退格键或对Ctrl + X或Ctrl + C作出反应,如下所示:
main@vm:~/hijack_execve$ sudo insmod hijack_execve.ko
[sudo] password for main:
main@vm:~/hijack_execve$ <any command>
^C^X
奇怪的是,只要它保持与上面相同的形式,我就可以劫持mmap()
,只将参数传递给真实的mmap()
。任何人都知道这里可能出现什么问题?我想知道劫持execve()
的过程是否在修改系统调用表期间使其不可用,并且在此期间需要execve()
来完成操作。