在Linux 3.x上挂钩sys_execve()

时间:2011-12-04 02:57:00

标签: c operating-system linux-kernel exec

我正在尝试通过修改系统调用表来挂接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);
}

2 个答案:

答案 0 :(得分:3)

您无法通过修改系统调用表来挂钩execve,方法是x86_64sys_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