#include<windows.h>
#include<stdio.h>
HANDLE GetProcessHandle()
{
HWND hwnd = FindWindowA(0, "Plants vs. Zombies"); //获取窗口句柄
//printf("窗口句柄为:%p\n", hwnd);
DWORD pid = 0;
GetWindowThreadProcessId(hwnd, &pid); //获取进程的pid
//printf("进程pid值为:%u\n", pid);
//根据pid获取进程句柄(读写权限)
HANDLE hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
return hProcessHandle;
}
DWORD R4(DWORD addr)
{
HANDLE h = GetProcessHandle();
DWORD value = 0;
DWORD realReadBytes = 0;
if (h)
{
ReadProcessMemory(h, (LPVOID)addr, &value, sizeof(DWORD), &realReadBytes);
CloseHandle(h); //关闭句柄并释放相应的内核资源
}
return value;
}
BOOL W4(DWORD addr, DWORD value)
{
HANDLE h = GetProcessHandle();
DWORD realWriteBytes = 0;
BOOL isSucc = WriteProcessMemory(h, (LPVOID)addr, &value, sizeof(DWORD), &realWriteBytes);
if (h)
{
CloseHandle(h); //关闭句柄并释放相应的内核资源
}
return isSucc;
}
int main()
{
DWORD sunValue2 = 0;
DWORD d = R4(R4(R4(R4(0x755E0C) + 0x868) + 0x118) + 0x4); //植物大战僵尸的基址,通过CE工具找出来的
W4(d + 0x5578, 12345); //改阳光值
sunValue2 = R4(d + 0x5578);
printf("阳光值为:%d\n", sunValue2);
return 1;
}
上面使用的基址是通过CE找出来的,另外说一下CE的使用技巧:
CE中需要不停地重复:搜索数值====>找出是什么访问了这个地址 这两个步骤,反复尝试直到找出绿色的静态基址即表示完成。
在执行了“是什么访问了这个地址“指令”后(一定要找mov指令),需要去掉mov指令中的偏移量得到地址A,然后将地址A添加到地址列表并继续搜索地址A。原理感觉和操作系统中的多级页面很相似,不知猜测是否准确