ptrace POKETEXT 在修改程序文本时如何工作?
How does ptrace POKETEXT works when modifying program text?
是否绕过被跟踪进程的只读页面权限?或者是否需要临时更改权限才能写入?如果是这种情况,权限更改是否对跟踪的进程可见?
查看 kernel sources,x86 使用通用(与 arch-specific 相反)ptrace 请求函数。
实际改动是通过mm/memory.c:__access_remote_vm(), which uses mm/gup.c:get_user_pages_remote()获取目标页面的内核映射,依次是kmap(page)、copy_to_user_pages()、set_page_dirty_lock()、kunmap (页)和 put_page(页)。
对实际所做的简单描述是,通过内核映射访问(修改)包含代码的目标进程内存——目标之间的虚拟内存 "window" 或 "barrier"进程和内核——而不是通过 user-space 进程可见的映射。
根据以上,我们可以回答上述问题:
Does PTRACE_POKETEXT
bypass read only page permissions of the traced process?
是的。为此,内核不使用对用户空间进程可见的页面保护机制;它使用自己的内部映射。
Or does it need to change permission temporarily to be writable?
不,不是。
请注意,除了用户空间内存中的更改数据(可能还有页面是否由可执行文件支持)以及任何内核或硬件错误外,内核何时以及如何使用其自己的映射对用户空间进程是不可见和检测不到的。
是否绕过被跟踪进程的只读页面权限?或者是否需要临时更改权限才能写入?如果是这种情况,权限更改是否对跟踪的进程可见?
查看 kernel sources,x86 使用通用(与 arch-specific 相反)ptrace 请求函数。
实际改动是通过mm/memory.c:__access_remote_vm(), which uses mm/gup.c:get_user_pages_remote()获取目标页面的内核映射,依次是kmap(page)、copy_to_user_pages()、set_page_dirty_lock()、kunmap (页)和 put_page(页)。
对实际所做的简单描述是,通过内核映射访问(修改)包含代码的目标进程内存——目标之间的虚拟内存 "window" 或 "barrier"进程和内核——而不是通过 user-space 进程可见的映射。
根据以上,我们可以回答上述问题:
Does
PTRACE_POKETEXT
bypass read only page permissions of the traced process?
是的。为此,内核不使用对用户空间进程可见的页面保护机制;它使用自己的内部映射。
Or does it need to change permission temporarily to be writable?
不,不是。
请注意,除了用户空间内存中的更改数据(可能还有页面是否由可执行文件支持)以及任何内核或硬件错误外,内核何时以及如何使用其自己的映射对用户空间进程是不可见和检测不到的。