// TODO: Add your control notification handler code here
HWND hGame = ::FindWindow(NULL,"植物大战僵尸中文版");
/* if(!hGame)
{
AfxMessageBox("游戏还没运行");
return;
}*/
DWORD id;
GetWindowThreadProcessId(hGame,&id);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,id);
LPCVOID lpOneBase= (LPCVOID)0x006A9EC0;
DWORD dwOne,number;
ReadProcessMemory(hProcess,lpOneBase,(LPVOID)&dwOne,4,&number);
LPCVOID lpTwoBase = (LPCVOID)(dwOne+0x768);
DWORD dwTwo;
ReadProcessMemory(hProcess,lpTwoBase,(LPVOID)&dwTwo,4,&number);
LPVOID lpThreeBase =(LPVOID)(dwTwo+0x5560);
    LPVOID lpBuff=(LPVOID)0x0000270F;
WriteProcessMemory(hProcess,lpThreeBase,lpBuff,4,&number);
CloseHandle(hProcess);咋不起作用我调试了半天也没调试出来,希望过路大侠指点下

解决方案 »

  1.   

    运行啥反应也没有,貌似我没内存写如成功
    sun的地址是*(*(*0x006A9EC0+0x768)+0x5560)
      

  2.   

    *(*(*0x006A9EC0+0x768)+0x5560)这个表达式中,每次取值有没有考虑正负?*0x006A9EC0的结果是什么?最好一步一步的提取
    UINT addr = ( UINT )( *0x006A9EC0 );
    .......
      

  3.   

    我觉得不需要考虑正负,还有我就是一步步的提取的!
    LPCVOID lpOneBase= (LPCVOID)0x006A9EC0;
        DWORD dwOne,number;
        ReadProcessMemory(hProcess,lpOneBase,(LPVOID)&dwOne,4,&number);
        LPCVOID lpTwoBase = (LPCVOID)(dwOne+0x768);
      

  4.   

    我也遇到了楼主同样的问题,跟了下,发现ReadProcessMemory取出的值都不是想要的值~~
      

  5.   

    我的搞定了
    int iTemp;
    DWORD dwAdress = 0x384ae8;
    SIZE_T dwRead = 0;
    ReadProcessMemory(hProcess,(LPVOID*)dwAdress,&iTemp,sizeof(iTemp),&dwRead);
    //原来错误的写法:ReadProcessMemory(hProcess, &dwAdress,&iTemp,sizeof(iTemp),&dwRead);
      

  6.   

        LPVOID lpBuff=(LPVOID)0x0000270F;
        WriteProcessMemory(hProcess,lpThreeBase,lpBuff,4,&number);改成
    DWORD x=0x0000270F;
    WriteProcessMemory(hProcess,lpThreeBase,&x,4,&number);
    试试
      

  7.   

    哎呀我真是笨,忘了可以插入断点调式了,呵呵。。
    插几个断点看看变量的值和最后的就OK了呵呵原来是参数搞错了
         LPVOID lpBuff=(LPVOID)0x0000270F;
        WriteProcessMemory(hProcess,lpThreeBase,lpBuff,4,&number); //这里lpBuff没取地址但是
                                                                                          编译能通过
        LPCVOID lpBuff=(LPCVOID)0x0000270F; //这里是LPCVOID
        WriteProcessMemory(hProcess,lpThreeBase,&lpBuff,4,&number);
    这里要是不加&的话编译就会出错
    为什么会这样呢?
    LPVOID 和LCPVOID在VC6.0中的定义是
    typedef void far            *LPVOID;
    typedef CONST void far      *LPCVOID;
    都是一个远指针(32位下已经没有意义了),就一个是const指针,一个不是,为什么不是const指针时不加取地址符会通过编译呢?