gpt4 book ai didi

linux-security-module - Linux 模块 : being notified about task creation and destruction

转载 作者:行者123 更新时间:2023-12-02 00:14:37 25 4
gpt4 key购买 nike

对于 Linux 上的 Mach 内核 API 仿真,我需要在刚刚创建或终止任务时调用我的内核模块。

在我的内核模块中,这可以通过 Linux 安全模块很好地完成,但几年前,它们通过取消导出所需的符号来阻止外部模块充当 LSM。

我能找到的唯一其他方法是让我的模块像 rootkit 一样工作。找到系统调用表并将其 Hook 到那里。

给内核打补丁是不可能的。我需要轻松安装我的应用程序。还有其他办法吗?

最佳答案

您可以使用 Kprobes ,它使您能够动态挂接到内核中的代码。您需要在涉及创建和销毁流程的函数中找到正确的函数,从而为您提供所需的信息。例如,对于创建的任务,fork.c 中的 do_fork() 将是一个很好的起点。对于销毁的任务,do_exit。您可能想要编写一个 retprobe,它是一种 kprobe,在函数执行结束时,在函数返回之前,还可以让您进行控制。您希望在函数返回之前进行控制的原因是通过检查返回值来检查它是否成功创建了进程。如果出现错误,则该函数将返回一个负值,或者在某些情况下可能返回 0。

你可以通过创建一个 kretprobe 结构来做到这一点:

static struct kretprobe do_fork_probe = {
.entry_handler = (kprobe_opcode_t *) my_do_fork_entry,
.handler = (kprobe_opcode_t *) my_do_fork_ret,
.maxactive = 20,
.data_size = sizeof(struct do_fork_ctx)
};

my_do_fork_entry 在控制进入 Hook 函数时执行,而 my_do_fork_ret 在它返回之前执行。您可以按如下方式将其 Hook :

do_fork_probe.kp.addr =
(kprobe_opcode_t *) kallsyms_lookup_name("do_fork");

if ((ret = register_kretprobe(&do_fork_probe)) <0) {
// handle error
}

在你的钩子(Hook)的实现中,获取参数和返回值有点笨拙。您可以通过保存的寄存器 pt_regs 数据结构获得这些。让我们看看返回 Hook ,在 x86 上,您可以通过 regs->ax 获取返回值。

static int my_do_fork_ret(struct kretprobe_instance *ri, struct pt_regs *regs)
{
struct do_fork_ctx *ctx = (struct do_fork_ctx *) ri->data;
int ret = regs->ax; // This is on x86
if (ret > 0) {
// It's not an error, probably a valid process
}
}

在入口点,您可以通过寄存器访问参数。例如在 x86 上,regs->di 是第一个参数,regs->si 是第二个参数等等。您可以谷歌获取完整列表。请注意,您不应依赖这些寄存器作为返回 Hook 中的参数,因为这些寄存器可能已被其他计算覆盖。

您肯定需要跳很多圈才能使它正常工作,但希望这篇说明能让您朝着正确的方向前进。

关于linux-security-module - Linux 模块 : being notified about task creation and destruction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com