gpt4 book ai didi

linux - Kprobe/Jprobe 在函数中间

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:27 39 4
gpt4 key购买 nike

我想拦截 fs/binfmt_elf.c 文件中的 load_elf_binary 函数,从通过参数传递给它的文件中读取一些自定义节标题,并设置一个从函数返回之前的几个寄存器(eax、ebx、ecx、edx)。

现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控制从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在研究一个绕过它并可能在函数中间(最好是最后)插入一个探针将是一个好主意。如果我错了,请纠正我并提供帮助。

最佳答案

那么,让我看看我是否正确理解您的操作。

您修改了 CPU(在模拟器中运行?)以便指令 0xF1 执行某种加密操作。您希望安排 load_elf_binary 在返回时调用此指令,并为该指令正确设置寄存器以发挥其魔力。以某种方式涉及自定义部分。

按照您所说的方式,这将很难做到。主要有几个问题:

  1. 我不确定你的威胁模型是什么,但如果你的魔法 CPU 指令只是直接解密映射数据,你将修改 linux 页面缓存中的页面,并且解密的代码或数据将对其他进程可见mmap这些页面。
  2. 此外,如果内核稍后释放页面,加密数据将重新加载到内存中,导致在不可预测的时间崩溃。
  3. 如果某些进程使这些页面变脏,解密后的数据将被刷新回磁盘,从而在磁盘上留下解密和加密数据的混合体。
  4. 如果您使用 JProbe,您的回调将在函数入口处被调用,这无论如何都太早了。

总而言之,这不会像您所说的那样有效。

更好的方法可能是定义您自己的 binfmt(或替换 elf_format 中的 load_binary 回调)。然后,您的 binfmt 可以以任何需要的方式加载二进制文件。如果你想利用现有的 ELF 加载器,你可以委托(delegate)给 load_elf_binary,并在返回时做你需要的任何操作加载进程,而不需要任何 JProbe 东西。

在任何一种情况下,请务必将您正在加密/解密的所有页面重新映射为 MAP_PRIVATE 并在更改内容之前将它们标记为脏。

关于linux - Kprobe/Jprobe 在函数中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30929692/

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