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

时间:2022-05-12 05:31:57
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";
    }


第二问题:如果直接填写连连看第一格地址的话,只能正确读取第一行连连看的数据 vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题vc++2010 ReadProcessMemory读取基址+多级偏移内存内容问题

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变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址

#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变量保存下读取道德返回值
然后加上偏移构建下次要读取的地址

#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);
}