您的位置:首页 > 其它

MFC读取游戏内存数据

2012-09-03 22:15 232 查看
读取游戏内存数据,这样可以根据这些数据我们再进行一些检测,比如检测游戏人物的血值、魔值、经验等等。

这里需要用到几个函数:

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)//根据返回的句柄读取内存指定内存地址的数据


[总结]这是一般外挂开发者都使用的办法,但是一般读取的内存数据较多,大家可以使用类来封装这些操作跟信息,这样大大简化了操作跟维护,当游戏更新,只要找到相对的基址就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: