C++ Windows7-WriteProcessMemory可以工作,但看不到任何效果

C++ Windows7-WriteProcessMemory可以工作,但看不到任何效果,c++,c,windows,C++,C,Windows,我知道这方面有很多问题,但似乎没有一个能解决我的问题 我在玩WriteProcessMemory功能。这一切看起来都很简单,但我在这里遇到了一个问题,似乎找不到解决办法 我所拥有的: 1) “受害者”——应该改变哪些记忆的过程 #include <windows.h> #include <stdio.h> int main() { SetConsoleTitle("MyTest"); int var = 5; printf ("%p\n\n

我知道这方面有很多问题,但似乎没有一个能解决我的问题

我在玩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;
}
#包括
#包括
int main()
{
设置控制台(“MyTest”);
int-var=5;
printf(“%p\n\n\n\n”,&var);
而(1)
{
printf(“%d\n”,var);
睡眠(1000);
}
返回0;
}
2) “攻击者”-试图更改“var”变量的过程

#包括
#包括
int main(){
HWND-HWND;
把手;
德沃德pid;
hwnd=FindWindow(0,“MyTest”);
GetWindowThreadProcessId(hwnd和pid);
handle=OpenProcess(PROCESS\u ALL\u ACCESS,FALSE,pid);
int-NewVar=89;
写入的字节数=0;
printf(“%d\n”,WriteProcessMemory(句柄,(void*)地址,&NewVar,4,&bytesWrited));
printf(“%d\n”,字节);
返回0;
}
当然,地址是“受害者”告诉我们的关于其“var”变量位置的信息

问题:

当我启动受害者,然后启动攻击者时,WriteProcessMemory返回1,BytesWrite设置为4-因此,理论上,一切正常。问题是客户端仍然打印Fs 5、5、5,而不是89。我也尝试过另一个例子,但没有用。我做错了什么


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

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

查看
pid
。您会发现您正在向错误的进程写入。FindWindow将查找cmd.exe的PID,因为很可能您正在使用SetConsoleTitle设置cmd.exe的窗口标题,正如Raymond所说的,只需更改查找受害者进程PID的方式,尝试使用受害者进程的进程名进行此操作。不,控制台窗口在旧Windows版本上由csrss.exe拥有,在当前版本上由conhost.exe拥有。您正在破坏进程,我建议尽快重新启动。按名称查找流程或自己启动。该变量必须声明为volatile。好吧,事实证明我确实找到了错误的进程ID。如果我硬编码它,效果会很好。谢谢大家:)。我也有同样的问题,但一直没能解决。我知道我正在更改正确的内存,因为我也在写之前和之后执行ReadProcessMemory,看到它从原始值更改为目标值,但在牺牲品进程中它没有更改。我在变量中添加了volatile,尝试了引用,然后取消引用,并使用malloc生成内存(这导致错误的内存被更改,但不知道为什么)。
#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;
}