You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下能否从变量内存位置执行任意机器码?

在Windows中从变量内存执行机器码的可能性

核心结论

默认情况下不行,但通过修改内存页权限,可以实现从变量所在的内存区域执行机器码。

内存权限与分离机制

Windows程序的虚拟内存区域默认按功能严格划分权限:

  • 代码段(.text段):拥有读+执行权限,专门存储编译后的合法机器码
  • 数据区域(包括全局变量、栈上局部变量、堆分配内存):默认只有读+写权限,没有执行权限

这种权限隔离是Windows 数据执行保护(DEP) 机制的核心,目的是阻止恶意代码通过缓冲区溢出等方式注入到数据区并执行。直接跳转到数据区执行代码会触发0xC0000005(访问违规)异常。

修改内存权限实现执行

要从变量内存执行机器码,必须通过Windows API修改目标内存页的权限:

  • 使用VirtualProtect函数,将目标内存的权限改为PAGE_EXECUTE_READWRITE(读+写+执行)或PAGE_EXECUTE_READ(读+执行)
  • 示例代码(C语言):
#include <windows.h>
#include <stdio.h>

int main() {
    // x86机器码:mov eax, 0x12345678; ret
    unsigned char shellcode[] = {0xB8, 0x78, 0x56, 0x34, 0x12, 0xC3};
    DWORD old_perms;

    // 修改内存页权限为可执行
    if (!VirtualProtect(shellcode, sizeof(shellcode), PAGE_EXECUTE_READWRITE, &old_perms)) {
        printf("VirtualProtect failed: %lu\n", GetLastError());
        return 1;
    }

    // 转换为函数指针并执行
    int (*exec_func)() = (int(*)())shellcode;
    int result = exec_func();
    printf("Exec result: 0x%X\n", result); // 输出0x12345678

    // 恢复原权限(可选,推荐用于安全规范)
    VirtualProtect(shellcode, sizeof(shellcode), old_perms, &old_perms);
    return 0;
}

关于内存布局的补充

代码段和数据段在虚拟内存中是物理分离的页,但这种隔离是权限层面的逻辑隔离,而非绝对的物理隔离。通过修改页表权限,你可以打破这种隔离,让数据页具备执行能力——这也是某些合法场景(比如JIT编译器)的实现方式。

内容的提问来源于stack exchange,提问作者FourierFlux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:22:19