我试图通过修改系统调用表来挂接Linux3.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);
}发布于 2012-03-13 02:15:30
您不能通过修改系统调用表来挂接execve,因为在x86_64上,sys_execve是从stub_execve调用的。所以调用链是sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve ..。看看LXR上的stub_execve吧。
发布于 2016-11-08 00:05:18
在过去,挂钩Linux内核中的syscall是一项更容易的任务,然而,在较新的内核中,程序集存根被添加到syscall中。为了解决这个问题,我在运行时修补了内核的内存。
您可以在此处查看我的挂钩sys_execve的完整解决方案:https://github.com/kfiros/execmon
https://stackoverflow.com/questions/8372912
复制相似问题