修改程序文本时,ptrace POKETEXT 是如何工作的?

bud*_*hao 4 c linux x86 ptrace system-calls

它是否绕过了被跟踪进程的只读页面权限?还是需要临时修改权限才可以写?如果是这种情况,被跟踪的进程是否可以看到权限更改?

Nom*_*mal 6

查看内核源代码,x86 使用通用(而不是特定于架构的)ptrace 请求函数。

实际更改由mm/memory.c:__access_remote_vm() 完成,它使用mm/gup.c:get_user_pages_remote()获取目标页面的内核映射,然后是 kmap(page)、copy_to_user_pages()、set_page_dirty_lock( )、kunmap(page) 和 put_page(page)。

对实际操作的简单描述是,通过内核映射访问(修改)包含代码的目标进程内存——目标进程和内核之间的虚拟内存“窗口”或“屏障”——而不是通过对用户空间进程可见的映射。

基于以上,我们可以回答上述问题:

是否PTRACE_POKETEXT绕过被跟踪进程的只读页面权限?

是的。为此,内核不使用用户空间进程可见的页面保护机制;它使用自己的内部映射。

还是需要临时修改权限才可以写?

不,不是的。

请注意,除了用户空间内存中更改的数据(以及可能页面是否由可执行文件支持)以及可能存在的任何内核或硬件错误外,内核何时以及如何使用自己的映射是不可见的和用户空间进程无法检测到。

  • 除非通过性能影响,否则无法检测到。关于最后一段:除了私有文件支持的映射(如进程用于其可执行文件+库)之外,如果在“fork”或其他之后在多个进程之间共享匿名页面,则内核将不得不进行COW。 (2认同)