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

我的想法是在写入内存地址时使用一些任务。所以我的想法是使用 mprotect 使地址写保护。当一些代码试图在那个内存地址上写一些东西时,我将使用 mprotect 处理程序来执行一些操作。处理完处理程序后,我想让写操作成功。所以我的想法是在处理程序中使内存地址不 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 到跟踪器和跟踪线程中,并在跟踪器中而不是

    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/

10-13 05:55
查看更多