植物大战僵尸吧 关注:574,110贴子:5,157,039
  • 6回复贴,共1

蒟蒻求助,摸索pvz修改器,关于用ReadProcessMemory函数读内存

只看楼主收藏回复

最近自己尝试捣鼓pvz修改器, 现在只做到了找出阳关计数的偏移, 想先做一个只能修改阳光的修改程序, 但是ReadProcessMemory函数(C语言)时遇到了一些问题, 希望有大佬能解答一下。
============================
曾经搜索了好几个博客, 发现他们使用ReadProcessMemory的格式都是一样的, 我也照抄这样的格式。
部分代码:(楼下放完整代码)
DWORD sunshineBaseAddress = 0x2A9EC0, sunshineBaseAddress_HuanCun = 0;
DWORD dwSize = 0 ;
//SIZE_T dwSize = 0;
if(0 == ReadProcessMemory(PVZprocess, (LPVOID)sunshineBaseAddress, &sunshineBaseAddress_HuanCun, sizeof(DWORD), &dwSize) )
{ printf("Fail.3\n"); return -1;}
出现两个warning:
1. warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]|
2.warning: passing argument 5 of 'ReadProcessMemory' from incompatible pointer type [-Wincompatible-pointer-types]|
第二个warning 可以把dwSize的数据类型改为SIZE_T解决
第一个warning始终为解决
最终运行结果为 控制台输出Fail.3, 即调用ReadProcessMemory函数这里出现问题, 但不清楚错误原理
============================================
完整代码:
#include <stdio.h>
#include <Windows.h>
int main(){
HWND hh = FindWindow(NULL, "Plants vs. Zombies");
DWORD processID = 0;
GetWindowThreadProcessId(hh, &processID);
if(!processID) { printf("Fail.1\n"); return -1;}
HANDLE PVZprocess = NULL;
PVZprocess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);
if(PVZprocess == NULL) { printf("Fail.2\n"); return -1;}
DWORD sunshineBaseAddress = 0x2A9EC0, sunshineBaseAddress_HuanCun = 0;
DWORD dwSize = 0 ;
//SIZE_T dwSize = 0;
if(0 == ReadProcessMemory(PVZprocess, (LPVOID)sunshineBaseAddress, &sunshineBaseAddress_HuanCun, sizeof(DWORD), &dwSize) ){
printf("Fail.3\n");
return -1;
}
DWORD sunshineOffset1 = 0x768, sunshineOffset1_HuanCun = 0;
if(0 == ReadProcessMemory(PVZprocess, (LPVOID)(sunshineBaseAddress_HuanCun + sunshineOffset1), &sunshineOffset1_HuanCun, sizeof(DWORD), &dwSize) ){
printf("Fail.4\n");
return -1;
}
DWORD sunshineOffset2 = 0x5560, sunshineOffset2_HuanCun = 0;
if(0 == ReadProcessMemory(PVZprocess, (LPVOID)(sunshineOffset1_HuanCun + sunshineOffset2), &sunshineOffset2_HuanCun, sizeof(DWORD), &dwSize) ){
printf("Fail.5\n");
return -1;
}
int x;
DWORD toSunshine;
printf("modify sunshine to : ");
scanf("%d", &x);
toSunshine = (DWORD) x;
WriteProcessMemory(PVZprocess, (LPVOID)(sunshineOffset1_HuanCun + sunshineOffset2), &toSunshine, sizeof(DWORD), &dwSize);
CloseHandle(PVZprocess);
getchar(); getchar();
return 0;
}


IP属地:山东1楼2021-10-24 21:04回复
    草 Windows编程


    IP属地:广东来自Android客户端2楼2021-10-25 10:47
    回复
      2025-12-31 01:44:30
      广告
      不感兴趣
      开通SVIP免广告
      基址是 6A9EC0


      IP属地:湖南3楼2021-10-25 11:04
      收起回复


        IP属地:山东4楼2021-10-25 13:15
        收起回复