c - ptrace POKETEXT 在修改程序文本时如何工作?

标签 c linux x86 system-calls ptrace

它是否绕过被跟踪进程的只读页面权限?或者是否需要临时更改权限才能写入?如果是这种情况,权限更改是否对跟踪的进程可见?

最佳答案

查看 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/

相关文章:

c++ - 使用 CLANG 内联汇编创建 C++ 预自增操作

c - 为什么会发生这种情况(C 编程运行时错误)?

c - 如何删除makefile中的中间目标文件

linux - 使 proc 可用于所有模块文件?

windows - 我如何在 node.js 中监听剪贴板事件?

performance - 计算数组中“小于x”的元素

c - 如何在我的计算机上启用对 POPCNT 指令/内部指令的支持?

c - 将文件名作为 C 的参数传递

c - 使用 fgets() 将文件中的行读取到结构数组中导致的段错误

linux - 模块 cwd 帮助