它是否绕过被跟踪进程的只读页面权限?或者是否需要临时更改权限才能写入?如果是这种情况,权限更改是否对跟踪的进程可见?
最佳答案
查看 kernel sources , x86 使用通用的(而不是特定于 arch 的)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)。
实际完成的简单描述是,通过内核映射访问(修改)包含代码的目标进程内存——目标进程和内核之间的虚拟内存“窗口”或“屏障”——以及而不是通过对用户空间进程可见的映射。
根据以上,我们可以回答上述问题:
Does
PTRACE_POKETEXT
bypass read only page permissions of the traced process?
是的。为此,内核不使用对用户空间进程可见的页面保护机制;它使用自己的内部映射。
Or does it need to change permission temporarily to be writable?
不,它没有。
请注意,除了用户空间内存中的更改数据(以及可能的页面是否由可执行文件支持),以及可能存在的任何内核或硬件错误,内核何时以及如何使用其自己的映射对用户空间进程是不可见和不可检测的。
关于c - ptrace POKETEXT 在修改程序文本时如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442087/