我目前正在做一些使用系统调用挂钩和日志来保护内核的项目...现在我已经完成了挂钩读取和套接字系统调用,当我尝试使用 execve 做同样的事情时(遵循哪个文件刚刚执行)我得到一个内核操作或者只是我做错了什么,因为我什至无法打开 dmesg 来查看我有什么错误(dmesg 也是可执行的,我只是覆盖了运行可执行文件的功能)。我还发现有一个叫做stub_execve的东西,你不能只从系统调用表中更改系统调用,因为有些系统调用是用另一个二进制文件或类似的东西包装的(如果我错了,请修复我) )。所以最后,我需要做的就是查看刚刚运行了哪些文件,我需要通过内核模块来完成它,是否有人想到如何做到这一点,或者如何跳过 Stub_execve 或类似的东西。 .?请帮助我,我将非常感激。
答案1
你调查过吗kprobes
?或者具体地说jprobes
。
使用 jprobe,您可以挂钩execve
(或任何其他内核函数),在该函数执行之前检查其参数等。它的工作方式是,调用者提供一个与其想要跟踪的函数具有相同签名的函数,并通过调用来注册它jprobe_register
。我们称该函数为my_execve
。然后,在执行实际函数之前,内核首先将其所有上下文(参数、寄存器值等)保存在堆栈上,并将控制权传递给my_execve
,并传入该上下文的副本。当my_execve
返回时(使用jprobe_return
而不是return
),内核恢复原始函数保存的上下文execve
并恢复执行。这意味着您对上下文所做的任何更改都不会影响原始函数的执行。您可以在此处查看示例:https://github.com/bytefire/esct/blob/master/esct.c。
如果您想操作上下文,例如更改寄存器中的值,则使用kprobes
,它遵循类似的模式,但涉及的语义稍微多一些。