我想分配一个可以在 Win32 上执行的缓冲区,但我在 Visual Studio 中有一个异常,因为 malloc 函数返回一个不可执行的内存区域。我读到有一个 NX 标志要禁用…我的目标是将字节码即时转换为 asm x86,同时牢记性能。
有人可以帮助我吗?
JS
原文由 John Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想分配一个可以在 Win32 上执行的缓冲区,但我在 Visual Studio 中有一个异常,因为 malloc 函数返回一个不可执行的内存区域。我读到有一个 NX 标志要禁用…我的目标是将字节码即时转换为 asm x86,同时牢记性能。
有人可以帮助我吗?
JS
原文由 John Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议
扩展上述答案,一个好的做法是:
VirtualAlloc
和读写访问分配内存。VirtualProtect
更改该区域的保护以执行读取访问所以它可能看起来像这样:
adr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
// write code to the region
ok = VirtualProtect(adr, size, PAGE_EXECUTE_READ, &oldProtection);
// execute the code in the region
原文由 zx485 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答1.4k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
4 回答931 阅读
1 回答999 阅读
1 回答1k 阅读
1 回答788 阅读
1 回答889 阅读
您不要为此使用
malloc
。你为什么要在 C++ 程序中呢?但是,您也不new
用于可执行内存。有特定于 Windows 的VirtualAlloc
函数来保留内存,然后您可以使用VirtualProtect
函数将其标记为可执行文件,例如应用PAGE_EXECUTE_READ
标志。完成后,您可以将指向已分配内存的指针转换为适当的函数指针类型,然后调用该函数。完成后不要忘记致电
VirtualFree
。这是一些非常基本的示例代码,没有错误处理或其他完整性检查,只是为了向您展示如何在现代 C++ 中实现这一点(程序打印 5):
与普通的 C++ 内存管理相比,这是非常不寻常的,但并不是真正的火箭科学。困难的部分是正确获取实际的机器代码。请注意,我在这里的示例只是非常基本的 x64 代码。