Kprobe / Jprobe处于功能中

时间:2015-06-19 04:01:08

标签: linux linux-kernel kernel elf kprobe

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

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

1 个答案:

答案 0 :(得分:2)

所以,让我看看我是否理解你正在做的事情。

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

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

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

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

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