【发布时间】:2023-03-29 21:59:01
【问题描述】:
我想拦截fs/binfmt_elf.c文件中的load_elf_binary函数,从通过参数传递给它的文件中读取一些自定义节标题,并在从返回之前设置一些寄存器(eax,ebx,ecx,edx)函数。
现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控件从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在研究绕过它并可能在函数的中间插入一个探针(最好是在最后)将是一个好主意。如果我错了,请纠正我并帮助解决这个问题。
【问题讨论】:
-
你为什么要在这里更改寄存器?
-
我不会说完全改变,我需要执行以下代码
__asm__ __volatile__ (".byte 0xf1" : : "a"(eax), "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi));让 CPU 知道某些 ELF 文件必须被视为我的安全功能的特殊文件正在努力。 -
据我所知,在返回时更改寄存器只会更改函数的返回值。这只会将东西放在错误路径上(或者当它应该在错误路径上时无法将东西放在错误路径上)。鉴于您已经专注于一种非常复杂且脆弱的方法来做您正在做的任何事情,因此很难建议要做的事情。您为什么不告诉我们您真正想要做什么,以便我们可以建议一种更简单的方法?
-
哦,0xf1 似乎不是 x86 上定义的操作码(c.f. ref.x86asm.net/coder32.html#xF1)
-
是的,这是自定义指令
标签: linux linux-kernel kernel elf kprobe