int szPassBuff;
ReadProcessMemory(hProcess,(LPCVOID)0xB7026B0,&szPassBuff,4,0);
我用cout<<"szPassBuff"<<szPassBuff<<"\t"<<"&szPassBuff"<<&szPassBuff<<endl;
地址是没有错误的,对应的10进制是200,可是为什么输出的是0和00477740呢?
我怀疑是地址错误,就换了一个地址,地址也是对的,对应的是2500,可是为什么输出的还是0和00477740呢?小弟不懂,请大神们教教啊...

解决方案 »

  1.   

    初步怀疑进程句柄 hProcess 有误 
    你检查下吧
      

  2.   

    static HANDLE hProcess;
    hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,Pid);你看看对不对?
      

  3.   

    真的哦,hProcess有误了,用了判断才知道的,可是错在哪里?
      

  4.   

    OpenProcess后查看GetLastError()的值
      

  5.   

    PROCESS_ALL_ACCESS, 需要先用 SeDebugPrivilege 提权。msdn:
    To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
      

  6.   

    这样输出可以吗?
    cout<<GetLastError()<<endl;
    不知道对不对,它只给一个6
      

  7.   

    对,你的pid是从任务管理器中获得的吧?
    我进行了如下测试:
    我从进程管理器中获得程序A的pid,程序A向地址xxxxxxxx写入内容,并用程序B对程序A地址xxxxxxxx进行读取
    成功读取。
    我的代码如下         CWnd *ieWnd;
             HANDLE  hProcess = NULL;
    DWORD dwprocessId;
    DWORD dwRdBytes;
    TCHAR szText[128];         ieWnd = FindWindow(NULL,_T("我是谁")); 
       ::GetWindowThreadProcessId(ieWnd->GetSafeHwnd(),&dwprocessId);
    hProcess = ::OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ,FALSE,dwprocessId);  ReadProcessMemory(hProcess,(LPVOID)0x004222e0,szText,128,&dwRdBytes);
      

  8.   

    说了怎么多给你们看看我想做什么吧。
    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
    static HWND Hwnd;
    static DWORD Pid;
    static HANDLE hProcess;
    static int szPassBuff;
    Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
    if(Hwnd)
    {
    cout<<"窗口寻找成功"<<endl;
    }
    else
    {
    cout<<"窗口寻找失败"<<endl;
    }
    Pid=GetWindowThreadProcessId(Hwnd,&Pid);
    if(Pid)
    {
    cout<<"PID寻找成功."<<endl;
    }
    else
    {
    cout<<"PID寻找失败."<<endl;
    }
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
    if(hProcess)
    {
    cout<<"ID寻找成功."<<endl;
    }
    else
    {
    cout<<"ID寻找失败."<<endl;
    }
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    cout<<GetLastError()<<endl;
    cout<<"数据:"<<&szPassBuff<<endl;
    return 0;
    }前面窗口和PID的成功的,后面ID就是失败了...你们帮我改改,可以吗?
      

  9.   

    Pid=GetWindowThreadProcessId(Hwnd,&Pid);换成
    GetWindowThreadProcessId(Hwnd,&Pid);
    PROCESS_ALL_ACCESS换成PROCESS_VM_READ|PROCESS_VM_OPERATION
      

  10.   

    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
    static HWND Hwnd;
    static DWORD Pid;
    static HANDLE hProcess;
    static int szPassBuff;
    Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
    if(Hwnd)
    {
    cout<<"窗口寻找成功"<<endl;
    }
    else
    {
    cout<<"窗口寻找失败"<<endl;
    }
    GetWindowThreadProcessId(Hwnd,&Pid);
    if(Pid)
    {
    cout<<"PID寻找成功."<<endl;
    }
    else
    {
    cout<<"PID寻找失败."<<endl;
    }
    hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION,FALSE,Pid);
    if(hProcess)
    {
    cout<<"ID寻找成功."<<endl;
    }
    else
    {
    cout<<"ID寻找失败."<<endl;
    }
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    cout<<"数据:"<<szPassBuff<<endl;
    return 0;
    }还有一个问题,就是我要关闭进程,这个怎么关闭?
      

  11.   

    PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_TERMINATE
    TerminateProcess(hProcess,0);
      

  12.   

    结束进程是上面的,关闭句柄用CloseHandle(hProcess)
      

  13.   

    我可以不可以这样输入数据?
    int Num;
    cin>>Num;
    WriteProcessMemory(hProcess,(LPVOID)0xB92CAC0,&Num,4,0);
      

  14.   

    GetWindowThreadProcessId的返回值为线程ID,该函数的第二个参数返回的才是进程ID
    另外对进程使用WriteProcessMemory函数,OpenProcess打开进程时需要增加PROCESS_VM_WRITE标志即 OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,Pid)
      

  15.   

    好像不行,你看看,错在哪里?
    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
    static HWND Hwnd;
    static DWORD Pid;
    static HANDLE hProcess;
    static int szPassBuff;
    int Num;
    Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
    if(Hwnd)
    {
    cout<<"窗口寻找成功"<<endl;
    }
    else
    {
    cout<<"窗口寻找失败"<<endl;
    }
    GetWindowThreadProcessId(Hwnd,&Pid);
    if(Pid)
    {
    cout<<"PID寻找成功."<<endl;
    }
    else
    {
    cout<<"PID寻找失败."<<endl;
    }
    hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION,FALSE,Pid);
    if(hProcess)
    {
    cout<<"ID寻找成功."<<endl;
    }
    else
    {
    cout<<"ID寻找失败."<<endl;
    }
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    cout<<"数据:"<<szPassBuff<<endl;
    cout<<"输入要修改的数据:";
    cin>>Num;
    WriteProcessMemory(hProcess,(LPVOID)0xB92CAC0,&Num,4,0);
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    cout<<"数据:"<<szPassBuff<<endl;
    TerminateProcess(hProcess,0);//结束进程
    CloseHandle(hProcess);//关闭句柄
    return 0;
    }
    目前数据是2100(10进制)
    我输入数据1000
    但是输出还是2100为什么?
      

  16.   

    OpenProcess打开进程时需要增加PROCESS_VM_WRITE标志即 OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,Pid)
      

  17.   

    等等,还有一个问题。问完了在睡!!!static HWND Hwnd;
    static DWORD Pid;
    static HANDLE hProcess;
    static int szPassBuff;
    HDC hdc;
    PAINTSTRUCT ps;
    switch(uMsg)
    {
    case WM_CREATE:
    SetTimer(hwnd,ID_Timer,200,NULL);
    break;
    case WM_PAINT:
    hdc=BeginPaint(hwnd,&ps);
    Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
    if(Hwnd)
    {
    TextOut(hdc,0,0,TEXT("窗口寻找成功."),strlen("窗口寻找成功."));
    }
    else
    {
    TextOut(hdc,0,0,TEXT("窗口寻找失败."),strlen("窗口寻找失败."));
    }
    GetWindowThreadProcessId(Hwnd,&Pid);
    if(Pid)
    {
    TextOut(hdc,0,18,TEXT("PID寻找成功."),strlen("PID寻找成功."));
    }
    else
    {
    TextOut(hdc,0,18,TEXT("PID寻找失败."),strlen("PID寻找失败."));
    }
    hProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ, FALSE,Pid);
    if(hProcess)
    {
    cout<<"ID寻找成功."<<endl;
    }
    else
    {
    cout<<"ID寻找失败."<<endl;
    }
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    EndPaint(hwnd,&ps);
    break;
    case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
    }这是在win32建立的工程。
    我只给窗口过程给大家看就行了
    我想问问:
    第一:我把数据显示在客户区里面?用TextOut还是什么函数?如果用TextOut怎么做?第二:还有我想用SetTimer来控制检测时间。可是我不知道怎么做。
    如果把函数放在PAINT消息中,一旦是退出游戏的话还是显示连接成功(表示没有和计时器关联)
    我应该怎么做?
      

  18.   

    那WM_TIMER消息需要放什么代码?
    我之前想过,但是不知道带代码
      

  19.   

    恩,得了,还有一个问题:
    首先,我先打开程序,3个提示都是显示失败的,然后我打开植物大战僵尸,3个提示都显示成功
    但是我不关闭程序,先关闭了植物大战僵尸,为什么PID寻找成功?其他的2个都是失败的,这是为什么呢?
      

  20.   

    static HWND Hwnd,Hwnd1;
    static DWORD Pid;
    static HANDLE hProcess;
    static int szPassBuff;
    HDC hdc;
    PAINTSTRUCT ps;
    switch(uMsg)
    {
    case WM_CREATE:
    SetTimer(hwnd,ID_Timer,200,NULL);
    break;
    case WM_TIMER:
    hdc=GetDC(hwnd);
    Hwnd=FindWindow(NULL,TEXT("植物大战僵尸中文版"));
    if(Hwnd)
    {
    TextOut(hdc,0,0,TEXT("窗口寻找成功."),strlen("窗口寻找成功."));
    }
    else
    {
    TextOut(hdc,0,0,TEXT("窗口寻找失败."),strlen("窗口寻找失败."));
    }
    GetWindowThreadProcessId(Hwnd,&Pid);
    if(Pid)
    {
    TextOut(hdc,0,18,TEXT("PID寻找成功."),strlen("PID寻找成功."));
    }
    else
    {
    TextOut(hdc,0,18,TEXT("PID寻找失败."),strlen("PID寻找失败."));
    }
    hProcess=OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_TERMINATE,FALSE,Pid);
    if(hProcess)
    {
    TextOut(hdc,0,36,TEXT("ID寻找成功."),strlen("ID寻找成功."));
    }
    else
    {
    TextOut(hdc,0,36,TEXT("ID寻找失败."),strlen("ID寻找失败."));
    }
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
    ReleaseDC(hwnd,hdc);
    // TerminateProcess(hProcess,0);//结束进程
    CloseHandle(hProcess);//关闭句柄
    break;
    case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
    }问一下:为什么不能这样TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
    显示数据?
    我想显示我应该怎么做啊?
      

  21.   

    szPassBuff是int类型
    ReadProcessMemory(hProcess,(LPCVOID)0xB92CAC0,&szPassBuff,4,0);
    TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
    什么不能这样TextOut(hdc,0,54,szPassBuff,sizeof(szPassBuff));
    显示数据?
    我想显示我应该怎么做啊?
      

  22.   

    szPassBuff的意义是什么
    如果是那个进程的一个地址,你需要ReadProcessMemory读到当前进程才能显示
      

  23.   

    szPassBuff是存放读取数据缓冲区啊...
      

  24.   

    szPassBuff的值代表什么,你要显示什么
      

  25.   

    wchar_t a[32];
    _itow(szPassBuff,a,10);
    TextOutW(hdc,0,54,a,wcslen(a));