我知道有很多问题,但似乎都没有解决我的问题。
我正在玩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。
答案 0 :(得分:1)
试试volatile int var = 5;
。编译器可能永远不会从RAM重新加载变量,而是将其保存在寄存器中。