首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位于函数中间的Kprobe/Jprobe

位于函数中间的Kprobe/Jprobe
EN

Stack Overflow用户
提问于 2015-06-19 12:01:08
回答 1查看 573关注 0票数 1

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

现在我读到Jprobes是访问目标函数参数的好方法,但问题是一旦控制从Jprobes函数返回,寄存器和堆栈的值就会按照它的规范恢复,所以我正在寻找一种绕过它的方法,在函数的中间(最好是接近末尾)插入一个探测器可能是一个好主意。

EN

回答 1

Stack Overflow用户

发布于 2015-06-19 14:53:29

那么,让我看看我是否理解了你在做什么。

您已经修改了CPU (在仿真器中运行?)所以指令0xF1做了一些加密的事情。您希望安排load_elf_binary在返回时调用此指令,并正确设置寄存器以使此指令发挥其魔力。不知何故,涉及到了自定义部分。

按照你所说的方式,这将是非常困难的。有几个主要问题:

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

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

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

在这两种情况下,请确保将所有要加密/解密的页面重新映射为MAP_PRIVATE,并在更改其内容之前将其标记为脏页面。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30929692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档