vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题

simonking8833 2011-10-01 08:58:28
vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题
请各位老鸟帮忙分析一下,谢谢!
一共两个问题:
第一: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";
}


第二问题:如果直接填写连连看第一格地址的话,只能正确读取第一行连连看的数据
...全文
1211 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonking8833 2011-10-04
  • 打赏
  • 举报
回复
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);
}
hztj2005 2011-10-02
  • 打赏
  • 举报
回复
棋盘数据不是你自己的?
否则定义为一个结构不就省事了。
W1nds 2011-10-01
  • 打赏
  • 举报
回复
读到正确的BUFFER就可以啊
最后一次读出数据的时候得到的就是数组的正确地址
通过你那个循环 写到数组里就可以了
simonking8833 2011-10-01
  • 打赏
  • 举报
回复
那chessdata数组怎么获取呢?
W1nds 2011-10-01
  • 打赏
  • 举报
回复
我觉得是楼主读取偏移的方式不对吧?
::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变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧