gpt4 book ai didi

linux - 如何在 mprotect 处理程序中获取当前程序计数器并更新它

转载 作者:太空狗 更新时间:2023-10-29 11:14:48 26 4
gpt4 key购买 nike

我想获取 mprotect 处理程序中的当前程序计数器 (PC) 值。从那里我想将 PC 的值增加“n”条指令,以便程序跳过一些指令。我想为 linux 内核版本 3.0.1 做所有这些。关于我可以获得 PC 值的数据结构以及如何更新该值的任何帮助?示例代码将不胜感激。提前致谢。

我的想法是在写入内存地址时使用一些任务。所以我的想法是使用mprotect来使地址写保护。当某些代码试图在该内存地址上写入内容时,我将使用 mprotect 处理程序来执行某些操作。处理完处理程序后,我想让写操作成功。所以我的想法是让handler内部的内存地址不 protected ,然后再执行写操作。当代码从处理函数返回时,PC 将指向原始的写指令,而我希望它指向下一条指令。因此,无论指令长度如何,我都想将 PC 增加一条指令。

检查以下流程

MprotectHandler(){
unprotect the memory address on which protection fault arised
write it again
set PC to the next instruction of original write instruction
}

内部主要功能:

main(){
mprotect a memory address
try to write the mprotected address // original write instruction
Other instruction // after mprotect handler execution, PC should point here
}

最佳答案

由于在多个 CISC 处理器上计算指令长度很乏味,我推荐一个稍微不同的过程:使用 clone(..., CLONE_VM, ...) fork 到一个跟踪器和一个tracee 线程,并在 tracer 中代替

    write it again
set PC to the next instruction of original write instruction

做一个

    ptrace(PTRACE_SINGLESTEP, ...)

- 在跟踪陷阱之后,您可能想要再次保护内存。

关于linux - 如何在 mprotect 处理程序中获取当前程序计数器并更新它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com