使用ptrace进行系统调用,但不通过修改文本来实现

3
什么是最好的方法来从跟踪器中进行系统调用,使系统调用像被跟踪者调用一样执行?我希望不需要写入跟踪者的文本页面。
如果被跟踪进程是一个动态可执行文件,则动态链接器保证有一个系统调用的指令。跟踪器可以找到并将指令指针设置为该指令。实际上,静态可执行文件在文本中某个地方都有该指令。
如果最好的方法是将系统调用指令写入文本中,那么PTRACE_POKETEXT会自动将目标页面更改为可写吗?如果它不这样做,我们就会遇到先有鸡还是先有蛋的问题。如果它这样做了,那么跟踪器是否负责将页面改回只读状态?
1个回答

1
你的想法实际上可以适用于许多系统调用。您需要了解确切的调用约定 - 必须使用ptrace()将跟踪进程的寄存器与参数一起加载(* )。找到一个系统调用指令(**),它会从用户模式转换到内核模式,并在其后设置断点。现在,将指令指针寄存器设置为系统调用指令的地址,并告诉跟踪进程执行 - 当它从系统调用返回时,执行将命中您的断点,并且跟踪进程可以重新控制并检查返回值并执行相应操作。清理时,您需要删除断点并将寄存器设置回其原始值,包括指令指针。

(*) 一些系统调用具有太多参数无法放入寄存器中,例如mmap(),请确保处理这些情况。

(**) 如果您可以反汇编libc.so,请在其中查找一些系统调用(例如open、read、write、socket、mmap等),并查看它们。每个系统调用都有一个系统调用指令。


mmap()有六个参数。系统调用约定允许在寄存器中使用这个数字。是否有任何系统调用具有超过六个参数? - Juho Östman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接