我知道有很多关于此的问题,但似乎没有一个能解决我的问题。
我正在研究 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/