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

跨进程访问C++变量失败,报错退出(错误码3221225477)

解决跨进程读写变量的内存访问错误问题

问题根源

你遇到的错误码3221225477对应Windows的STATUS_ACCESS_VIOLATION,本质原因是Windows系统中每个进程拥有独立的虚拟地址空间:

  • 第一个程序输出的coins地址是它自身虚拟地址空间中的地址,这个地址在第二个进程的虚拟空间中要么未映射,要么属于完全无关的内存区域,直接通过指针访问会触发内存保护机制,导致访问违例。

正确实现方案

要跨进程读写内存,必须使用Windows提供的进程内存操作API:OpenProcess、ReadProcessMemory和WriteProcessMemory,步骤如下:

  1. 获取目标进程的ID(PID)和变量的虚拟地址
  2. 打开目标进程并获取足够的内存操作权限
  3. 使用API读写目标进程的指定内存地址

修改后的第一个程序(输出PID和变量地址)

#include <iostream>
#include <Windows.h>

int main()
{
    int coins = 1;
    // 输出当前进程ID,供第二个程序使用
    std::cout << "Process ID: " << GetCurrentProcessId() << std::endl;
    // 输出coins的虚拟地址
    std::cout << "coins address: " << &coins << std::endl;
    // 保持进程运行,等待第二个程序操作
    Sleep(10000);
    return 0;
}

第二个程序(跨进程读写实现)

#include <iostream>
#include <Windows.h>

int main()
{
    DWORD target_pid;
    uintptr_t coins_address;

    // 输入第一个程序的PID和coins地址
    std::cout << "Enter target process ID: ";
    std::cin >> target_pid;
    std::cout << "Enter coins address (hex): ";
    std::cin >> std::hex >> coins_address;

    // 打开目标进程,获取读写内存的权限
    HANDLE h_process = OpenProcess(
        PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,
        FALSE,
        target_pid
    );
    if (h_process == NULL) {
        std::cout << "Failed to open process. Error code: " << GetLastError() << std::endl;
        return 1;
    }

    // 读取coins当前值
    int current_value;
    if (!ReadProcessMemory(
        h_process,
        (LPCVOID)coins_address,
        &current_value,
        sizeof(current_value),
        NULL
    )) {
        std::cout << "Failed to read memory. Error code: " << GetLastError() << std::endl;
        CloseHandle(h_process);
        return 1;
    }
    std::cout << "Current coins value: " << current_value << std::endl;

    // 修改coins的值为100
    int new_value = 100;
    if (!WriteProcessMemory(
        h_process,
        (LPVOID)coins_address,
        &new_value,
        sizeof(new_value),
        NULL
    )) {
        std::cout << "Failed to write memory. Error code: " << GetLastError() << std::endl;
        CloseHandle(h_process);
        return 1;
    }
    std::cout << "Successfully updated coins to " << new_value << std::endl;

    // 关闭进程句柄,释放资源
    CloseHandle(h_process);
    return 0;
}

关键注意事项

  • 权限问题:运行第二个程序时可能需要管理员权限,否则OpenProcess可能失败。
  • 变量生命周期:确保第一个程序中的coins变量在第二个程序操作时仍然存在(比如你的代码中用Sleep保持进程运行,这是可行的)。
  • 地址有效性:每次启动第一个程序,coins的虚拟地址可能会变化(因为ASLR地址空间随机化机制),所以不能硬编码地址,必须每次运行时获取最新地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:20:14