使用ptrace进行系统调用但不调用文本

时间:2013-12-21 14:22:01

标签: linux ptrace

从跟踪器进行系统调用以便执行系统调用的最佳方法是什么,就像tracee调用一样?我更愿意这样做,而无需写入tracee的文本页面。

如果tracee进程是动态可执行文件,则保证动态链接器具有系统调用的指令。跟踪器可以找到它并设置指令指针。实际上,静态可执行文件会在文本的某处附带指令。

如果最好的方法是将系统调用指令写入文本,PTRACE_POKETEXT会自动将目标页面更改为可写吗?如果没有,我们就会遇到鸡和蛋的问题。如果是,跟踪器是否负责将页面更改回只读?

1 个答案:

答案 0 :(得分:1)

您的想法实际上可以用于许多系统调用。您需要了解确切的调用约定 - 您必须使用ptrace()来使用参数(*)加载tracee的寄存器。查找系统调用指令(**),从用户模式下降到内核模式,然后设置断点。现在将指令指针寄存器设置为系统调用指令的地址,并告诉tracee进程执行 - 当它从系统调用返回时执行将命中断点并且跟踪进程可以获得控制权并可以检查返回值并执行什么是合适的。要进行清理,您需要删除断点并将寄存器设置回原始值,包括指令指针。

(*)有些系统调用有太多参数无法容纳寄存器,mmap()会浮现在脑海中,确保并处理这些情况。

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