向大家请教,如何用  ReadProcessMemory 读取内存地址里的文本

解决方案 »

  1.   

    读出来的当然是数值。
    你把十进制换成Ascii对应的字母不就好了
      

  2.   

    晕,楼主直接把他们读到字符串里去就可以了啊。给楼主个例子吧,
    例子包括3个文件s1.cpp, s2.cpp, s.h
    s1.cpp和s2.cpp分别编译成2个exe文件,
    首先运行s1.exe,会弹出个MessageBox提示启动s2.exe这时候,保持这个Messagebox在这里,然后启动s2.exe,s2.exe会弹出一个MessageBox显示从s1.exe中读出来的字符串。下面是代码:
    //s1.cpp#include "s.h"int main()
    {
    TCHAR s[256]=_T("ReadProcessMemory的用法");//这个是读取的字符串
            //创建内存映射文件,用来传递PID,字符串s的地址和字符串的长度
    HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,3*sizeof(DWORD),FILE_MAP_NAME);
    if(NULL == hFileMapping)
    {
    MessageBox(NULL,_T("CreateFileMapping Failed.\nTry to restart me."),_T("s1.exe"),MB_OK);
    return 0;
    }
    HANDLE hMVOF = MapViewOfFile(hFileMapping,FILE_MAP_WRITE,0,0,0);
    if(NULL == hMVOF)
    {
    CloseHandle(hFileMapping);
    MessageBox(NULL,_T("MapViewOfFile Failed.\nTry to restart me."),_T("s1.exe"),MB_OK);
    return 0;
    }
            //内存映射文件创建OK,写入内容
    DWORD* FP = (DWORD*)hMVOF;
    FP[0] = GetCurrentProcessId();    //当前进程的PID
    FP[1] = (DWORD)s;                 //字符串s的地址
    FP[2] = (DWORD)_tcslen(s);        //字符串s的长度
    MessageBox(NULL,_T("Start s2.exe before click the \"OK\" button on this messagebox."),_T("s1.exe"),MB_OK);       //提示启动s2        //下面是善后
    UnmapViewOfFile(hMVOF);
    CloseHandle(hFileMapping);
    return 0;
    }
    //s2.cpp#include"s.h"int main()
    {
            //打开内存映射文件,读出PID,字符串地址和字符串长度
    HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ,FALSE,FILE_MAP_NAME);
    if(NULL == hFileMapping)
    {
    MessageBox(NULL,_T("Can not Open File Mapping.\ns1.exe not running?\nPlease make sure s1.exe is running and start me again -_-"),_T("s2.exe"),MB_OK);
    return 0;
    }
    HANDLE hMVOF = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);
    if(NULL == hMVOF)
    {
    CloseHandle(hFileMapping);
    MessageBox(NULL,_T("Something wrong during MapViewOfFile.\nYou could try to restart me -_-"),_T("s2.exe"),MB_OK);
    return 0;
    }
            //打开内存映射文件OK,读取
    DWORD *FP   =(DWORD*)hMVOF;
    DWORD PID   =FP[0];            //s1的PID
    void* ADDR  =(void*)FP[1];     //字符串的地址
    DWORD LEN   =FP[2];            //字符串的长度
    UnmapViewOfFile(hMVOF);
    CloseHandle(hFileMapping);     //关闭内存映射文件 TCHAR* BUFFER = new TCHAR[LEN+1];   //准备buffer
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE,PID);   
    if(NULL == hProcess)
    {
    delete[] BUFFER;
    MessageBox(NULL,_T("OpenProcess Error.\ns1.exe not running?\nPlease make sure s1.exe is running and start me again -_-"),_T("s2.exe"),MB_OK);
    return 0;
    }
    if(0==ReadProcessMemory(hProcess,ADDR,BUFFER,(LEN+1)*sizeof(TCHAR),NULL))
    {
    delete[] BUFFER;
    MessageBox(NULL,_T("ReadProcessMemory Failed."),_T("s2.exe"),MB_OK);
    return 0;
    }
            //读取OK,显示之
    MessageBox(NULL,BUFFER,_T("s2.exe ReadProcessMemory OK"),MB_OK);
    delete[] BUFFER;
    return 0;
    }
    //s.h
    // 如果想用UNICODE,取消下面两行的注释就行了
    //#define _UNICODE
    //#define UNICODE#include<TCHAR.h>
    #include<windows.h>#ifndef FILE_MAP_NAME
    #define FILE_MAP_NAME _T("XXXX_XXXX")
    #endif
      

  3.   

    我的问题很简单,就是从指定的内存地址处,以文本的方式读出地址处的内容!比如一个地址里,放的是“我爱我家ABC”就读出这些字符即可! 
      

  4.   

    ReadProcessMemory(远程进程句柄,远程进程中内存地址,本地进程中内存,要传送的字节数,实际传送的字节数)TCHAR a[2];比如:ReadProcessMemory(hWnd,0x1100,a,2,NULL);他读取出来的依然是 数值,读出不了中文!
      

  5.   

    楼主去看我的例子吧,读出来的就是字符串“ReadProcessMemory的用法”
    如果你看懂了,问题就解决了,看不懂的话,再来问。
      

  6.   


    // 小测试程序
    TCHAR buf[] = _T("你好 Hello,World!");
    TCHAR szText[256] = {0};
    DWORD dwAddr = (DWORD)buf; // 字符串的地址
    ReadProcessMemory(GetCurrentProcess(), (LPCVOID)dwAddr, szText, sizeof(buf), NULL);
    AfxMessageBox(szText);
      

  7.   

    很奇怪, 6楼的代码用到了 filemapping 怎么还用 ReadProcessMemory啊?
      

  8.   

    结贴:
         感谢  “magic7004”     耐心解答
         感谢  “VisualEleven” 深入浅出的解答     感谢大家的帮助!
      

  9.   


    filemapping是为了获得PID和字符串地址,用ReadProcessMemory是为了演示它的用法
      

  10.   

    “magic7004”你的程序写的是很不错但是把简单的问题,以复杂话表现就不太好了!