【问题标题】:Modify Program Counter (PC) to a saved address将程序计数器 (PC) 修改为保存的地址
【发布时间】:2014-03-05 07:19:24
【问题描述】:

我正在开发一个使用内联汇编执行长跳转的程序。据我了解,我需要做的就是将 FP 和 PC 替换为保存的 FP 和 PC。使用程序集,我可以更改帧指针 (%ebp),但我无法在 PC 上执行此操作。

int jump(int x)
{
  int oldFP = getebp();  //the FP of the calling function
  int oldPC = getebp()+4;  //the PC of the calling function

  ljump();  //uses assembly to change FP (works) but can't figure out PC

  return x;
}

而我的ljump()

ljump: # return stack frame pointer FP 
       movl  savedFP, %ebp
       ret

我之前尝试更换 PC 一直在使用跳转,但是我通常会遇到分段错误。

我们将不胜感激。

【问题讨论】:

  • 不确定答案是什么,但您可以研究一下setjmplongjmp 是如何为您的平台实现的,并尝试类似的方法。
  • 不要尝试重新实现longjmp,只需使用longjmp。非本地转移比看起来更难。最好让运行时库为您完成。它了解非本地传输的各种 ABI 要求。 (在 x86 上,您还需要恢复非易失性寄存器。)
  • 感谢您的建议。我查看了 longjmp 的源代码,但很难阅读它。更改帧指针很容易并且有效,但事实证明更改 PC 更加困难

标签: c assembly program-counter


【解决方案1】:

如果您希望您的代码在某个预定义地址上继续,您可以在您的 asm 代码(伪代码)中这样做:

push myNewAddress
ret

或者如果您喜欢不同的方式,可以使用寄存器:

mov  eax, myNewAddress
jmp eax

您不能直接用指令修改 PC,因为它始终是当前指令所在的位置。但是,您应该注意,这可能会导致内存泄漏或其他副作用,因为堆栈可能没有得到正确处理。

【讨论】:

  • 谢谢!不幸的是,我在尝试跳跃时不断收到“分段错误”,但我认为你在正确的轨道上
  • 你尝试了哪一个?如果你使用ret,然后检查你是否有正确的推送和ret指令大小。
猜你喜欢
  • 2012-06-08
  • 2018-11-11
  • 2021-08-22
  • 2019-01-31
  • 2011-05-22
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多