C 编程(函数指针转换)

标签 c function pointers casting

int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();

这是如何运作的?字符串被转换为函数指针

最佳答案

c3RET 指令。当 x86 机器跳转到这个被解释为代码的字符串时,它将执行 RET 并因此直接跳回去而不做任何事情(因此忽略字符串的其余部分)。由于 x86 上的标准调用约定是将您的返回值放在 eax 中,但是代码在返回之前没有做任何事情,所以 eax 中已经存在的内容仍然存在,并让 C 代码将其解释为已“返回”。

这在很大程度上取决于您的机器是 x86,并且您可以在数据和函数指针之间进行转换(并执行结果)——一个非常系统特定的 hack。无论如何,这都不是符合标准的 可移植 C!

(\xXX 是 C 的转义语法,用于通过十六进制的 ASCII 代码将单个不可读字符插入字符串,如果您不知道那部分的话。)

关于C 编程(函数指针转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24853956/

相关文章:

c - 结构中的链表

c - 指向函数的指针c语言基础

function - Godot和GDScript可以将函数存储在变量中吗?

c - 为什么 C 标准库中没有哈希表?

c - 这个脚本哪里有错误?

python - python函数调用的参数顺序

c - 有效的多重返回值

pointers - 从 Go 中的字符串访问内存地址?

通过 NULL 指针访问 C++ 静态常量

c - 带有数组的指针函数