1

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

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

4

1 回答 1

2

所以,让我看看我是否理解你在做什么。

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

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

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

总而言之,这不会像你所说的那样工作得很好。

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

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

于 2015-06-19T06:53:28.740 回答