请各位老鸟帮忙分析一下,谢谢!
一共两个问题:
第一:c++基址加偏移问题[[[0x4455C8+0x8]+0x8]+0xa0]
c++使用ReadProcessMemory经过基址加偏移读取不到正确的数据
byte chessdata[10][18];
void CbaiwinllkDlg::OnBnClickedReadchessdata()
{
//获取窗口句柄
HWND gameh = ::FindWindow(gamellkclassname,gamellkcaption);
//获取窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定进程
HANDLE processh=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读取进程内存数据
DWORD byread;
LPCVOID pbase=(LPCVOID)0x4455C8; //棋盘数据基址
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processh,pbase,nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0xA0),nbuffer,10*18,&byread);
//显示棋盘数据
char buf[10];
m_chessdata=_T("");
for(int y=0;y<10;y++)
{
for(int x=0;x<18*4;x+=4) //读一行
{
itoa(chessdata[y][x],buf,16); //转换成字串
m_chessdata+=buf;
m_chessdata+=_T(" ");
}
//换行
m_chessdata+="\r\n";
}
第二问题:如果直接填写连连看第一格地址的话,只能正确读取第一行连连看的数据
5 个解决方案
#1
我觉得是楼主读取偏移的方式不对吧?
::ReadProcessMemory(processh,pbase,nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0xA0),nbuffer,10*18,&byread);
可以定义一个DWORD变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址
::ReadProcessMemory(processh,pbase,nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0xA0),nbuffer,10*18,&byread);
可以定义一个DWORD变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址
#2
那chessdata数组怎么获取呢?
#3
读到正确的BUFFER就可以啊
最后一次读出数据的时候得到的就是数组的正确地址
通过你那个循环 写到数组里就可以了
最后一次读出数据的时候得到的就是数组的正确地址
通过你那个循环 写到数组里就可以了
#4
棋盘数据不是你自己的?
否则定义为一个结构不就省事了。
否则定义为一个结构不就省事了。
#5
byte chessdata[10][18];
void CbaiwinllkDlg::OnBnClickedReadchessdata()
{
//获取窗口句柄
HWND gameh = ::FindWindow(gamellkclassname,gamellkcaption);
//获取窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定进程
HANDLE processh=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读取进程内存数据
DWORD byread;
DWORD tmp;
LPCVOID pbase=(LPCVOID)0x4455C8; //棋盘数据基址
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processh,pbase,&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0x8),&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0x8),&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0xA0),nbuffer,10*18,&byread);
//显示棋盘数据
char buf[10];
m_chessdata=_T("");
for(int y=0;y<10;y++)
{
for(int x=0;x<18*4;x+=4) //读一行
{
itoa(chessdata[y][x],buf,16); //转换成字串
m_chessdata+=buf;
m_chessdata+=_T(" ");
}
//换行
m_chessdata+="\r\n";
}
UpdateData(false);
}
#1
我觉得是楼主读取偏移的方式不对吧?
::ReadProcessMemory(processh,pbase,nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0xA0),nbuffer,10*18,&byread);
可以定义一个DWORD变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址
::ReadProcessMemory(processh,pbase,nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0x8),nbuffer,10*18,&byread);
::ReadProcessMemory(processh,(LPCVOID)(&chessdata+0xA0),nbuffer,10*18,&byread);
可以定义一个DWORD变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址
#2
那chessdata数组怎么获取呢?
#3
读到正确的BUFFER就可以啊
最后一次读出数据的时候得到的就是数组的正确地址
通过你那个循环 写到数组里就可以了
最后一次读出数据的时候得到的就是数组的正确地址
通过你那个循环 写到数组里就可以了
#4
棋盘数据不是你自己的?
否则定义为一个结构不就省事了。
否则定义为一个结构不就省事了。
#5
byte chessdata[10][18];
void CbaiwinllkDlg::OnBnClickedReadchessdata()
{
//获取窗口句柄
HWND gameh = ::FindWindow(gamellkclassname,gamellkcaption);
//获取窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
//打开指定进程
HANDLE processh=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);
//读取进程内存数据
DWORD byread;
DWORD tmp;
LPCVOID pbase=(LPCVOID)0x4455C8; //棋盘数据基址
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processh,pbase,&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0x8),&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0x8),&tmp,4,&byread);
::ReadProcessMemory(processh,(LPCVOID)(tmp+0xA0),nbuffer,10*18,&byread);
//显示棋盘数据
char buf[10];
m_chessdata=_T("");
for(int y=0;y<10;y++)
{
for(int x=0;x<18*4;x+=4) //读一行
{
itoa(chessdata[y][x],buf,16); //转换成字串
m_chessdata+=buf;
m_chessdata+=_T(" ");
}
//换行
m_chessdata+="\r\n";
}
UpdateData(false);
}