gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:58:30 25 4
gpt4 key购买 nike

主题: PPC 汇编语言 - Linux Loadble 内核模块

详情:在系统调用表 Hook 中从内核调用时如何访问本地 TOC 区域(r2)?

我已经为 Linux 编写了一个可加载的内核模块,它使用系统调用表 Hook 来拦截系统调用并记录有关它们的信息,然后再将调用传递给原始处理程序。这是安全产品的一部分。我的模块运行良好,并且在生产代码中运行在各种 Linux 内核版本和发行版上,32 位和 64 位内核都在 x86 硬件上运行。

我正在尝试移植此代码以在 Linux 上为 PPC 处理器运行,但遇到了一些问题。使用 Linux 内核源代码,很容易看出系统调用表在 PPC 上的实现方式有何不同。我可以用我自己编译的处理程序中的函数地址替换表中的条目,没问题。

但是,这是我遇到的问题。 PPC ABI 使用称为目录 (TOC) 地址的东西,该地址存储在 CPU 的 R2 寄存器中,并希望通过使用与该寄存器中包含的地址(TOC 地址)的偏移量来寻址模块的全局和本地数据。这在进行函数调用的正常情况下工作正常,因为编译器知道在进行调用之前将模块的 TOC 地址加载到寄存器中(或者它已经存在,因为通常您的函数是由您自己的代码调用的)。

但是,当我将自己的函数的地址(在运行时从我加载的内核模块)放入系统调用表时,内核使用 R2 值调用我的处理程序,这不是我编译的 C 代码所期望的值,所以我的代码得到控制而无法访问其数据。

有人知道那里有任何示例代码显示如何处理这种情况吗?我无法重新编译内核。这应该是运行时系统调用表 Hook 的简单案例,但我还没有弄清楚,或者找到任何特定于 PPC 的示例。

想法包括:

手工编码一个汇编语言 stub ,保存 R2 值,用我的本地 TOC 地址加载寄存器,执行我的代码,然后在调用原始处理程序之前恢复旧值。我没有 PPC 组装经验的深度来做到这一点,我也不确定它会起作用。

一些神奇的 gcc 选项可以在不使用 TOC 的情况下生成我的代码。有一个记录在案的 gcc 选项 "-mno-toc"这在我的 PPC6 Linux 上不起作用。看起来它可能只是系统 V.4 和嵌入式 PowerPC 的一个选项。

任何帮助是极大的赞赏 !

谢谢!

最佳答案

Linux 有一个通用的系统调用审计基础设施,可以在 powerpc 上运行,您可以从用户空间访问。您是否考虑过使用它而不是编写内核模块?

关于linux-kernel - 如何在 PPC Linux 上运行时 Hook 系统调用表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517331/

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