gpt4 book ai didi

c++ - 如何分配可执行内存缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:14 24 4
gpt4 key购买 nike

我想分配一个可以在 Win32 上执行的缓冲区,但我在 visual studio 中有一个异常,因为 malloc 函数返回一个不可执行的内存区域。我读到有一个 NX 标志可以禁用...我的目标是将字节码动态转换为 asm x86,同时牢记性能。

有人可以帮助我吗?

最佳答案

您不为此使用 malloc。无论如何,你为什么要在 C++ 程序中?但是,您也不会将 new 用于可执行内存。有 Windows 特定的 VirtualAlloc保留内存的函数,然后使用 VirtualProtect 将其标记为可执行文件函数应用,例如,PAGE_EXECUTE_READ 标志。

完成后,您可以将指向已分配内存的指针转换为适当的函数指针类型,然后调用该函数。不要忘记调用VirtualFree完成后。

这里是一些非常基本的示例代码,没有错误处理或其他完整性检查,只是为了向您展示如何在现代 C++ 中完成此操作(程序打印 5):

#include <windows.h>
#include <vector>
#include <iostream>
#include <cstring>

int main()
{
std::vector<unsigned char> const code =
{
0xb8, // move the following value to EAX:
0x05, 0x00, 0x00, 0x00, // 5
0xc3 // return what's currently in EAX
};

SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
auto const page_size = system_info.dwPageSize;

// prepare the memory in which the machine code will be put (it's not executable yet):
auto const buffer = VirtualAlloc(nullptr, page_size, MEM_COMMIT, PAGE_READWRITE);

// copy the machine code into that memory:
std::memcpy(buffer, code.data(), code.size());

// mark the memory as executable:
DWORD dummy;
VirtualProtect(buffer, code.size(), PAGE_EXECUTE_READ, &dummy);

// interpret the beginning of the (now) executable memory as the entry
// point of a function taking no arguments and returning a 4-byte int:
auto const function_ptr = reinterpret_cast<std::int32_t(*)()>(buffer);

// call the function and store the result in a local std::int32_t object:
auto const result = function_ptr();

// free the executable memory:
VirtualFree(buffer, 0, MEM_RELEASE);

// use your std::int32_t:
std::cout << result << "\n";
}

与普通的 C++ 内存管理相比,这是非常不寻常的,但不是真正的火箭科学。困难的部分是获得正确的实际机器代码。请注意,我这里的示例只是非常基本的 x64 代码。

关于c++ - 如何分配可执行内存缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936534/

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