我正在尝试通过修改系统调用表来挂接Linux 3.x内核上的sys_execve()
函数。问题是sys_execve()
只有在执行失败时才会返回错误代码。使用我正在使用的包装器函数(见下文),当在有效的可执行文件上调用sys_execve()
时,它执行正常并且一切正常。但是,如果在不存在的文件或其他导致错误的情况下调用它,则调用程序将崩溃:
segfault at 3b ip 000000000000003b...
使用strace
检查被钩住的sys_execve()
的返回值,显示-1或ENOSYS
而不是正确的错误代码,这使我感到困惑,因为我检查了我的程序集包装函数以及sys_execve()
的Linux源代码。关于为什么我的包装器没有正确传递错误代码的任何建议?
asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) {
return orig_func(name, argv, envp, regs);
}
答案 0 :(得分:3)
您无法通过修改系统调用表来挂钩execve
,方法是x86_64
从sys_execve
调用stub_execve
。所以调用链是sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve
...在LXR上查看stub_execve。
答案 1 :(得分:0)
过去,在Linux内核中挂钩系统调用是一项更容易的任务,但是,在较新的内核中,程序集存根被添加到系统调用中。为了解决这个问题,我动态修补了内核的内存。
您可以在此处查看我的完整解决方案以挂钩sys_execve:https://github.com/kfiros/execmon