c++ - 在 Windows 10 c++ x64 上从内存执行代码?

标签 c++ windows assembly executable

我试图弄清楚如何在 Windows 10 上执行任意代码。我觉得这段代码应该可以工作,但它给了我一个访问冲突写入位置错误。

#include <iostream>
#include <vector>

#include <Windows.h>

// x64 assembly
#define ret (uint8_t)(0xc3)
#define nop (uint8_t)(0x90)

int main() {
    std::vector<uint8_t> raw_code = {
        nop, ret
    };

    LPVOID exec = VirtualAlloc(NULL, raw_code.size(), MEM_RESERVE, PAGE_READWRITE);
    memcpy(exec, raw_code.data(), raw_code.size());

    DWORD old_protect;
    VirtualProtect(exec, raw_code.size(), PAGE_EXECUTE, &old_protect); // Line where error occurs

    ((void(*)())exec)();

    VirtualProtect(exec, raw_code.size(), old_protect, &old_protect);
    VirtualFree(exec, raw_code.size(), MEM_RELEASE);

    return 0;
}

最佳答案

嗯,一方面MEM_RESERVE意味着未分配内存,因此尝试取消引用指针将导致访问冲突(如您所见)。不要太可爱,只是像往常一样分配你的内存,使用 MEM_COMMIT | MEM_RESERVE .
您也没有将内存设置为可执行,您需要使用 PAGE_EXECUTE_READWRITE反而。否则,在启用 DEP 的情况下,您的代码将因访问冲突而崩溃。

关于c++ - 在 Windows 10 c++ x64 上从内存执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64544602/

相关文章:

c++ - 为什么 gcc 和 icc 为 C++ 函数生成具有相同标签名称的 asm?

调用手动加载的代码 (AT&T + C) (g++)

macos - Wine64 是如何应对 macOS 的?

影响 "HAS-A Parent"的 C++ 状态机

c++ - 复制赋值运算符应该按 const 引用还是按值传递?

python - 在 Windows 下如何共享日志文件?

python - django操作系统错误: no library called "cairo" was found on windows

c++ - wParam 为 0 时,什么时候会调用 WM_ENDSESSION?

c++ - 在 C++ 中通过命名管道传递结构的 char*

c++ - 为什么调试器需要符号来重建堆栈?