我想拦截文件中的load_elf_binary
函数,fs/binfmt_elf.c
从通过参数传递给它的文件中读取一些自定义节标题,并在从函数返回之前设置一些寄存器(eax、ebx、ecx、edx)。
现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控制从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在寻找一种解决方法并且可能在函数的中间插入一个探针(最好是在最后)将是一个好主意。如果我错了,请纠正我并提供帮助。
我想拦截文件中的load_elf_binary
函数,fs/binfmt_elf.c
从通过参数传递给它的文件中读取一些自定义节标题,并在从函数返回之前设置一些寄存器(eax、ebx、ecx、edx)。
现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控制从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在寻找一种解决方法并且可能在函数的中间插入一个探针(最好是在最后)将是一个好主意。如果我错了,请纠正我并提供帮助。
所以,让我看看我是否理解你在做什么。
您已经修改了 CPU(在模拟器中运行?),以便该指令0xF1
执行某种加密操作。您想安排 load_elf_binary 在返回时调用该指令,并为该指令正确设置寄存器以发挥其魔力。不知何故涉及自定义部分。
以您所说的方式,这将很难做到。有几个主要问题:
总而言之,这不会像你所说的那样工作得很好。
更好的方法可能是定义您自己的 binfmt(或替换 中的load_binary
回调elf_format
)。然后您的 binfmt 可以以任何需要的方式加载二进制文件。如果你想利用现有的 ELF 加载器,你可以委托给 load_elf_binary,然后在返回时做你需要的任何操作来操作加载的进程,而不需要任何 JProbe 的东西。
在任何一种情况下,请务必重新映射您正在加密/解密的所有页面,MAP_PRIVATE
并在更改其内容之前将它们标记为脏。