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

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

我的想法是在写内存地址时使用一些任务。 所以我的想法是使用mprotect使地址写保护。 当某些代码尝试在该内存地址上写入内容时,我将使用mprotect处理程序执行某些操作。 照顾处理程序后,我想使写入操作成功。 所以我的想法是使内存处理程序中的内存地址不受保护,然后再次执行写入操作。 当代码从处理函数返回时,PC将指向原始写入指令,而我希望它指向下一条指令。 所以我想要一个指令增加PC,不pipe指令长度如何。

检查以下stream程

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

里面主要function:

 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, ...)把一个跟踪器和一个跟踪线程分叉,

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

做一个

  ptrace(PTRACE_SINGLESTEP, ...) 

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

这里是展示基本原理的示例代码:

 #include <signal.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <sys/ucontext.h> static void handler(int signal, siginfo_t* siginfo, void* uap) { printf("Attempt to access memory at address %p\n", siginfo->si_addr); mcontext_t *mctx = &((ucontext_t *)uap)->uc_mcontext; greg_t *rsp = &mctx->gregs[15]; greg_t *rip = &mctx->gregs[16]; // Jump past the bad memory write. *rip = *rip + 7; } static void dobad(uintptr_t *addr) { *addr = 0x998877; printf("I'm a survivor!\n"); } int main(int argc, char *argv[]) { struct sigaction act; memset(&act, 0, sizeof(struct sigaction)); sigemptyset(&act.sa_mask); act.sa_sigaction = handler; act.sa_flags = SA_SIGINFO | SA_ONSTACK; sigaction(SIGSEGV, &act, NULL); // Write to an address we don't have access to. dobad((uintptr_t*)0x1234); return 0; } 

它显示如何更新PC响应页面错误。 它缺乏以下你必须实现自己:

  • 指令长度解码。 正如你所看到的,我已经硬编码+7这恰好在我的64位Linux上工作,因为导致页面错误的指令是一个7字节的MOV 。 正如阿马利在答复中所说,这是一个乏味的问题,你可能不得不使用像libudis86之类的外部库。
  • mprotect()处理。 您的地址导致siginfo->si_addr的页面错误,并使用它来查找mprotected页面的地址并取消它的保护应该是微不足道的。