gpt4 book ai didi

更改 C 中的程序计数器

转载 作者:行者123 更新时间:2023-11-30 18:38:05 26 4
gpt4 key购买 nike

我想更改程序计数器(指令指针)的内容。我认为通过重写 C 中的系统信号处理程序,我可以获取系统堆栈帧中的指针。从那里我可以获得函数的返回地址并更改它。

但是,我在堆栈中得到了指针,但我不知道返回地址到底存储在堆栈帧上的位置。

void signal_handler(int signal){

char* ptr = (char*) & signal;
// As, signal is stored on the paramter list of the stack,
// I get the address in the current stack frame. From , here
// I want to change the return address(that is stored in the
// current stack frame).
}

最佳答案

发生段错误后,程序处于不确定状态。您不能再依赖任何具有正确值的东西(例如寄存器)。

即使您可以在故障发生后返回到下一条指令,除非您的信号处理程序[在上下文中]反汇编有问题的指令,并更改寄存器值进行补偿,否则您现在已经有了一个程序这是不值得信任的,并且可能会继续出现段错误或[更糟糕]操作,带来更加灾难性的结果(例如,在错误文件上取消链接,等等)。

但是,由于“蹦床”信号,您不能执行此操作。有关详细信息,请参阅 sigreturn 手册页。提供给信号处理程序的堆栈帧不一定是正常的。

您必须将程序恢复到已知的“安全”状态。做到这一点的唯一方法是[正如我在上面的评论中提到的]是使用 sigsetjmp 设置恢复点并在信号处理程序内执行 siglongjmp 。 旁注:使用这些与在 C++ 中使用异常类似,但您必须手动完成更多工作。

我已经完成了大量的段错误捕获信号处理程序和恢复,但它们都涉及使用 sigsetjmp/siglongjmp

这也引出了一个问题:为什么不直接调试您的程序,使其一开始就不会出现段错误?您有什么特殊需要可以排除这种情况?

关于更改 C 中的程序计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35073881/

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