在Linux 3.x上挂钩sys_execve()

ddc*_*dcc 5 c operating-system exec linux-kernel

我试图sys_execve()通过修改系统调用表来将函数挂接到Linux 3.x内核上。问题是sys_execve()仅在执行不成功时才应返回错误代码。使用我正在使用的包装函数(见下文),当sys_execve()在有效的可执行文件上调用该函数时,它可以正常执行,并且一切正常。但是,当在不存在的文件或其他导致错误情况的文件上调用该文件时,调用程序将崩溃,并显示以下内容:

segfault at 3b ip 000000000000003b...
Run Code Online (Sandbox Code Playgroud)

使用strace来检查钩子的返回值sys_execve()显示-1还是ENOSYS正确的错误代码,这使我感到困惑,因为我已经检查了包装函数的汇编以及的Linux源代码sys_execve()。为什么我的包装程序没有正确传递错误代码的任何建议?

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);
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*kov 3

您无法通过修改系统调用表来进行挂钩,execve例如x86_64从. 所以调用链是......看看LXR 上的stub_execve 。sys_execvestub_execvesys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve