首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux3.x上挂接sys_execve()

在Linux3.x上挂接sys_execve()
EN

Stack Overflow用户
提问于 2011-12-04 10:57:00
回答 2查看 3.7K关注 0票数 5

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

代码语言:javascript
复制
segfault at 3b ip 000000000000003b...

使用strace检查挂钩的sys_execve()的返回值显示-1或ENOSYS,而不是正确的错误代码,这让我感到困惑,因为我已经检查了包装器函数的程序集以及sys_execve()的Linux源代码。对于我的包装器没有正确传递错误代码有什么建议吗?

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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吧。

票数 3
EN

Stack Overflow用户

发布于 2016-11-08 00:05:18

在过去,挂钩Linux内核中的syscall是一项更容易的任务,然而,在较新的内核中,程序集存根被添加到syscall中。为了解决这个问题,我在运行时修补了内核的内存。

您可以在此处查看我的挂钩sys_execve的完整解决方案:https://github.com/kfiros/execmon

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8372912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档