c++ - Windows 7 - WriteProcessMemory 有效但看不到任何效果

标签 c++ c windows

我知道有很多关于此的问题,但似乎没有一个能解决我的问题。

我正在研究 WriteProcessMemory 函数。一切看起来都很简单,但我在这里遇到了一个问题,似乎找不到解决方案。

我有什么:

1)“受害者”——应该改变内存的过程

#include <windows.h>
#include <stdio.h>

int main()
{

    SetConsoleTitle("MyTest");

    int var = 5;

    printf ("%p\n\n\n\n", &var);

    while (1)
    {
        printf ("%d\n", var);
        Sleep(1000);
    }

    return 0;
}

2) “攻击者”——试图改变“var”变量的进程

#include <stdio.h>
#include <windows.h>

int main() {

    HWND hwnd;       
    HANDLE handle;   
    DWORD pid;       

    hwnd = FindWindow(0, "MyTest");
    GetWindowThreadProcessId(hwnd, &pid);
    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    int NewVar = 89; 

    SIZE_T bytesWritten = 0;

    printf ("%d\n", WriteProcessMemory(handle, (void *)ADDRESS, &NewVar, 4, &bytesWritten)); 

    printf("%d\n", bytesWritten);

    return 0;
}

当然,ADDRESS 是“受害者”告诉我们其“var”变量的位置。

问题:

当我启动受害者然后启动攻击者时,WriteProcessMemory 返回 1 并且 bytesWritten 设置为 4 - 因此,理论上,一切顺利。问题是客户端仍然 printfs 5、5、5 而不是 89。我也用其他示例尝试过,但无济于事。我做错了什么?

不确定是否有必要,但操作系统是 32 位 Windows 7 Ultimate。

最佳答案

试试 volatile int var = 5;。编译器可能永远不会从 RAM 中重新加载变量,而是将其保存在寄存器中。

关于c++ - Windows 7 - WriteProcessMemory 有效但看不到任何效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22640422/

相关文章:

c++ - 如何告诉编译器使用 C++ 2011 _in_code_ 而不是标志

c++ - 使用 MSVC 2013 构建 Polycode 后,我在哪里可以找到库的文件?

使用C中的指针将数据从一维数组复制到二维数组?

c - C语言中可以修改char字符串吗?

windows - Go程序访问线程环境 block 时出现panic

c# - Winsock tcp/ip 套接字监听但连接被拒绝,竞争条件?

c++ - 在C++中 boost 日志记录和“类对象”日志记录行为

c - 我该如何修复这个 (is_sorted) 递归函数?

android - 定义程序的 'Not responding' 行为

java - 迭代性能 Java 与 C++