gpt4 book ai didi

函数指针可以用来运行 "data"吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:45 24 4
gpt4 key购买 nike

这不是大多数人可能会使用的东西,但它只是浮现在脑海中并且困扰着我。

是否可以使用一些机器代码,比如一个 c 字符串,然后将其地址转换为函数指针,然后使用它来运行该机器代码?

最佳答案

按照 Carl Norum 的说法,理论上您可以。这称为“自修改代码”。

在实践中,通常会阻止您的是操作系统。大多数主要的现代操作系统在设计上都区分了“可读”、“可读写”和“可执行”内存。当这种操作系统内核加载程序时,它会将代码放入一个特殊的“可执行”页面,该页面被标记为只读,因此用户应用程序无法修改它;同时,试图GOTO一个不在“可执行”页面中的地址也会导致错误异常。这是出于安全目的,因为多种恶意软件和病毒以及其他黑客攻击都依赖于让程序跳转到修改后的内存中。例如,黑客可能会向应用程序提供数据,导致某些函数将恶意代码写入堆栈,然后运行它。

但本质上,操作系统本身加载程序所做的正是您所描述的——它将代码加载到内存中,将内存标记为可执行,然后跳入其中。

在嵌入式硬件世界中,可能没有操作系统可以挡住你的路,因此一些平台经常使用它。在 PlayStation 2 上,我曾经一直这样做——如果有一些代码是特定于沙漠级别的,并且没有在其他地方使用,我不会一直将它保存在内存中——相反,我将它与沙漠级别一起加载,并将我的函数指针修复到正确的可执行文件。当用户离开关卡时,我会从内存中转储该代码,将所有这些函数指针设置为异常处理程序,然后将下一关卡的代码加载到同一空间。

关于函数指针可以用来运行 "data"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3073653/

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