【问题标题】:Hooking sys_execve() on Linux 3.x在 Linux 3.x 上挂钩 sys_execve()
【发布时间】:2011-12-04 02:57:00
【问题描述】:

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

【问题讨论】:

  • 这可能不相关,但我有兴趣替换 linux >3 中的系统调用。你能给我提供一些相关的信息吗?

标签: c operating-system linux-kernel exec


【解决方案1】:

您不能通过修改系统调用表来挂钩execve,例如在x86_64 上,sys_execve 是从stub_execve 调用的。所以调用链是sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve……看看LXR上的stub_execve

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多