7

如何 JMP 到 C 中的特定地址?

我想用

goto 0x10080000

这不起作用,还有其他方法可以更改程序计数器的地址吗?

4

3 回答 3

11

您可以地址转换为函数指针,然后跳转到:

((void (*)(void))0x10008000)();

为了更清楚一点:

typedef void (*func_t)(void);
...
((func_t)0x10008000)();

但这是一个函数,编译器会发出一个期望返回的分支指令(然后由你决定是否让你的函数返回)。另请注意,编译器将生成一段代码,该代码期望在给定地址找到一个 C 函数,关于如何给出和返回函数参数。

如果您需要发出不带返回的分支指令,则需要使用内联汇编。

于 2013-10-04T06:49:28.867 回答
8

在 GCC 中,您可以使用计算的 goto。我自己没有尝试过,但它应该像这样工作:

void *address = 0x10080000;
...
goto *address;
于 2013-10-04T09:58:53.357 回答
3

内联汇编指令也应该起作用:

asm("jump 0x10080000");

于 2015-07-28T21:41:07.383 回答