如何将程序执行跳转到C中的特定地址?

Sam*_*Sam 7 c c++

我希望程序跳转到内存中的特定地址并继续从该地址执行.我考虑过使用,goto但我没有标签而只是内存中的地址.

无需担心从跳转地址返回.

编辑:使用GCC编译器

Ran*_*ook 24

内联汇编可能是最简单,最"优雅"的解决方案,尽管这样做非常不寻常,除非您正在编写调试器或某些专门的内省系统.

另一种选择可能是声明一个指向void function(void (*foo)(void))的指针,然后将指针设置为包含你的地址,然后调用它:

void (*foo)(void) = 0x12345678;
foo();
Run Code Online (Sandbox Code Playgroud)

由于编译器认为你正在进行子程序调用,所以会在堆栈上推送一些东西,但由于你不关心返回,这可能会有效.


Chr*_*odd 15

gcc有一个允许跳转到任意地址的扩展名:

void *ptr = (void *)0x1234567;  // a random memory address
goto *ptr;                      // jump there -- probably crash
Run Code Online (Sandbox Code Playgroud)

这与使用设置为固定值的函数指针几乎相同,但实际上它将使用跳转指令而不是调用指令(因此堆栈不会被修改)

  • clang 12(可能更早)支持这一点。 (2认同)

Rob*_*obᵩ 8

#include <stdio.h>
#include <stdlib.h>

void go(unsigned int addr) {
  (&addr)[-1] = addr;
}

int sub() {
  static int i;
  if(i++ < 10) printf("Hello %d\n", i);
  else exit(0);
  go((unsigned int)sub);
}

int main() {
  sub();
}
Run Code Online (Sandbox Code Playgroud)

当然,这会调用未定义的行为,与平台有关,假定代码地址与大小相同int,等等.


And*_*dro 5

它应该是这样的:

unsigned long address=0x80; 

void (*func_ptr)(void) = (void (*)(void))address;
func_ptr();
Run Code Online (Sandbox Code Playgroud)

但是,这不是一个很安全的操作,跳转到某个未知地址可能会导致崩溃!