linux - sys_execve Hook 3.5 内核

标签 linux kernel hook system-calls execve

我正在尝试在 x86_32 上的 Linux 内核 v3.5 中挂接 sys_execve 系统调用。我只是将 sys_call_table 入口地址更改为我的钩子(Hook)函数

asmlinkage long (*real_execve)( const char __user*, const char __user* const __user*,
                 const char __user* const __user* );
...
asmlinkage long hook_execve( const char __user* filename, const char __user* const __user* argv,
                    const char __user* const __user* envp )
{
    printk( "Called execve hook\n" );
    return real_execve( filename, argv, envp );
}
...
real_execve = (void*)sys_call_table[ __NR_execve ];
sys_call_table[ __NR_execve ] = (unsigned long)hook_execve;

我确实设置了修改 sys_call_table 条目的页面权限,并且提到的方案适用于另一个系统调用(chdir、mkdir 等)。但是在执行 Hook 时我得到了空指针取消引用:

Mar 11 14:18:08 mbz-debian kernel: [ 5590.596033] Called execve hook
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596408] BUG: unable to handle kernel NULL pointer dereference at   (null)
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596486] IP: [<  (null)>]   (null)
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596526] *pdpt = 0000000032302001 *pde = 0000000000000000 
Mar 11 14:18:08 mbz-debian kernel: [ 5590.596584] Oops: 0010 [#1] SMP

我用三个参数调用 sys_execve,因为 arch/x86/kernel/entry_32.S 包含 PTREGSCALL3(execve)。但是,我尝试使用四个参数调用它(添加 struct pt_regs*),但我遇到了同样的错误。也许这种执行方法完全错误?还是我错过了什么?

更新 #1

我发现 sys_call_table[ __NR_execve ] 实际上包含 ptregs_execve 的地址(不是 sys_execve)。在arch/x86/kernel/entry_32.S中定义如下:

#define PTREGSCALL3(name) \
ENTRY(ptregs_##name) ; \
CFI_STARTPROC; \
leal 4(%esp),%eax; \
pushl_cfi %eax; \
movl PT_EDX(%eax),%ecx; \
movl PT_ECX(%eax),%edx; \
movl PT_EBX(%eax),%eax; \
call sys_##name; \
addl $4,%esp; \
CFI_ADJUST_CFA_OFFSET -4; \
ret; \
CFI_ENDPROC; \
ENDPROC(ptregs_##name)
...
PTREGSCALL3(execve)

所以为了修改 sys_execve 我需要替换它的代码而不修改它的地址?我读过类似的东西 here , 这是要走的路吗?

更新#2

实际上我发现了以下调用序列:do_execve->do_execve_common->search_binary_handler->security_bprm_check,而这个 security_bprm_check 是 LSM(Linux 安全模块)操作的包装器,控制二进制文件的执行。之后我阅读并关注了this link我让它工作了。它解决了我的问题,因为现在我可以看到要执行的进程的名称,但我仍然不确定它的正确性。也许其他人会澄清所有这些内容。

最佳答案

过去,在 Linux 内核中 Hook 系统调用是一项更容易的任务,但是,在较新的内核中,程序集 stub 被添加到系统调用中。为了解决这个问题,我即时修补了内核的内存。

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

关于linux - sys_execve Hook 3.5 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15339279/

相关文章:

linux - PXE 使用我的 kickstart 文件的一部分

linux - echo 没有正确回显值 - 没有双引号的 BASH Linux

linux - 打印 `current` task_struct 的 comm 字段,Linux 内核

sockets - 我如何在内核空间(freebsd)中监听一个 tcp 端口?

c - KERNEL_APC_PENDING_DURING_EXIT 蓝屏死机

triggers - Sequelize Hooks - 函数是否像在关联中一样公开模型?

c++ - 命令行中缺少 DSO(使用 CMake)

linux - Python - [SSL : CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl. c:1091)

linux-kernel - 如何在 PPC Linux 上运行时 Hook 系统调用表?

cocoa - 检测 cocoa 中的全局粘贴事件