MFC读取游戏内存数据

读取游戏内存数据,这样可以根据这些数据我们再进行一些检测,比如检测游戏人物的血值、魔值、经验等等。
这里需要用到几个函数:

FindWindow//查找窗口
HWND FindWindow(
LPCTSTR lpClassName, // class name
LPCTSTR lpWindowName // window name
);

GetWindowThreadProcessId//获取窗口进程ID
DWORD GetWindowThreadProcessId( 
HWND hWnd, // handle to window 
LPDWORD lpdwProcessId // process identifier
);

OpenProcess//打开进程
HANDLE OpenProcess( 
DWORD dwDesiredAccess, // access flag 
BOOL bInheritHandle, // handle inheritance option 
DWORD dwProcessId // process identifier
);

ReadProcessMemory//读取进程内存数据
BOOL ReadProcessMemory( 
HANDLE hProcess, // handle to the process LPCVOID 
lpBaseAddress, // base of memory area 
LPVOID lpBuffer, // data buffer 
DWORD nSize, // number of bytes to read 
LPDWORD lpNumberOfBytesRead // number of bytes read
);


【准备工具】
1.VC++6.0或者VS
2.SPY++

首先利用SPY++获取到游戏窗口的标题或者窗口类名称
HWND GameHwnd;//游戏的窗口句柄
DWORD GameID;//游戏的进程ID
HANDLE GameHandle;//游戏的实例句柄
DWORD bytes;

LPCVOID GameAdd=(LPCVOID)0x02A2ECE8;
//如果数据是相连的大家可以使用偏移地址(LPCVOID)(0x02A2ECE8+4)
//比如0x02A2ECE8是血的基址,0x02A2ECEB是魔的.这样大家就使用偏移0x02A2ECE8+4即可
//也可以把首地址包装成一个宏
LPVOID GameBuffer;

GameHwnd=::FindWindow(NULL,"MyGame");//查找一个叫MyGame窗口标题的程序
::GetWindowThreadProcessId(GameHwnd,&GameID);//根据窗口句柄获取到进程ID
GameHandle=::OpenProcess(PROCESS_ALL_ACCESS,false,GameID);//根据进程ID打开进程
::ReadProcessMemory(GameHandle,GameAdd,&GameBuffer,4,&bytes)//根据返回的句柄读取内存指定内存地址的数据

[总结]这是一般外挂开发者都使用的办法,但是一般读取的内存数据较多,大家可以使用类来封装这些操作跟信息,这样大大简化了操作跟维护,当游戏更新,只要找到相对的基址就可以了。

你可能感兴趣的:(MFC开发)