当内存地址0x01005A60的值小于255也就是可以放在一个字节里的时候,使用下面程序可以正确的把直读出显示到m_edit中!但是当程序的值也就是扫雷这个游戏超过255个雷的时候,下面程序显示的数值就不对了!
假设你设置256个累的话,读出的值就是0,257是1,258是2!!怎么修改下面的程序,避免这个错误,请大家帮帮忙!
////////////////////////////////////////////////////////////////
DWORD hProcId;
char* HP = new char[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);
if (OK != TRUE)
MessageBox("失败);
m_edit.Format(_T("%d"),HP[0]);
UpdateData(FALSE);
/////////////////////////////////////////////////////////////////////
假设你设置256个累的话,读出的值就是0,257是1,258是2!!怎么修改下面的程序,避免这个错误,请大家帮帮忙!
////////////////////////////////////////////////////////////////
DWORD hProcId;
char* HP = new char[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);
if (OK != TRUE)
MessageBox("失败);
m_edit.Format(_T("%d"),HP[0]);
UpdateData(FALSE);
/////////////////////////////////////////////////////////////////////
ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);第4个参数是要读的字节数!!
但是我写成
ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,2,NULL);
还是不对!
四个字节 一共32位 首先前后16位颠倒 然后每个16位的低八8位和高8位颠倒
比如:
int a=256;
转换成普通顺序的四个字节的hex应该是
00 00 01 00
但是你去找a的地址&a的内存数据时 看到的应该是
00 01 00 00
而看来你现在是按照int a的首地址去读的 当然就读不到了 256已经进位了
所以最好还是按照数据类型读 别去直接读地址 ^^
用指针强制转换就行啦!m_edit.Format(_T("%d"),HP[0]);
改成:
m_edit.Format(_T("%d"),*(WORD *)HP);
m_edit.Format(_T("%d"),*(DWORD *)HP);
我查看HEX发现确实是你说的那样,但是我使用int *强制转换以后还是一样的效果啊!
256还是显示0!!
m_edit.Format(_T("%d"),HP[0]);
中的HP是char如果读INT
应该修改
char* HP = new char[20];
为
int* HP = new int[20];
DWORD hProcId;
int* HP = new int[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);
if (OK != TRUE)
MessageBox("失败);
m_edit.Format(_T("%d"),HP[0]);
UpdateData(FALSE);
/////////////////////////////////////////////////////////////////////
这这……到底是怎么回事啊??哪个大哥帮帮我啊
救命呀?这是怎么搞的哦!
我在也看不出要怎么改了,大家帮帮忙啊!
DWORD hProcId;
char* HP = new char[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId); BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,4,NULL);
if (OK != TRUE)
MessageBox("失败");DWORD dwHP = *(LPDWORD)HP;
m_edit.Format(_T("%d"),dwHP);
UpdateData(FALSE);