我用游戏修改工具查到一数据的内存地址,用任务管理器看到PID
怎样读写内存数据,简而言之:
已知内存地址(0x0040320c)和PID(1234)
怎样用ReadProcessMemory和WriteProcessMemory读写内存
我的步骤是:
hp=OpenProcess(PROCESS_ALL_ACCESS,false,1234);
WriteProcessMemory()
WriteProcessMemory的参数怎么写?
需要VirtualAllocalEx吗?

解决方案 »

  1.   

    //以下函数修改指定进程中执行内存地址的信息
    BOOL ModiProcessMemoryValue(MODI_POINT_PROPERTY *p)
    {
    DWORD rsize; return WriteProcessMemory(p->ph, p->Address , &(p->value), 
    p->vsize, &rsize);
    }p->ph  进程句柄
    p->Address 目标进程目标地址
    p->value   需要写入目标地址的值
    p->vsize   需要写入的内容大小
    rsize      为写入的字节个数
      

  2.   

    oldworm最近好像使劲挣分,100分都给他好了,我想看看都少个三角号后就是一颗星:)
      

  3.   

    其实还是多看看MSDN,研究一下好。
    http://nowcan.yeah.net
    里面有VB下用这些函数的介绍
      

  4.   

    我看过msdn了,也知道参数的意义,但有谁能把上面那个具体例子的写一下
      

  5.   

    供参考
    直接调用ReadProcessMemory和WriteProcessMemory函数实现进程间通讯通过调用ReadProcessMemory以及WriteProcessMemory函数用户可以按类似与Windows3.1的方法实现进程间通讯,在发送进程中分配一块内存存放数据,可以调用GlobalAlloc或者VirtualAlloc函数实现:
    pApp->m_hGlobalHandle=GlobalAlloc(GMEM_SHARE,1024);
    可以得到指针地址:
    pApp->mpszGlobalHandlePtr=(LPSTR)GlobalLock
    (pApp->m_hGlobalHandle);
    在接收进程中要用到用户希望影响的进程的打开句柄。为了读写另一进程,应按如下方式调用OpenProcess函数:
    HANDLE hTargetProcess=OpenProcess(
    STANDARD_RIGHTS_REQUIRED|
    PROCESS_VM_REDA|
    PROCESS_VM_WRITE|
    PROCESS_VM_OPERATION,//访问权限
    FALSE,//继承关系
    dwProcessID);//进程ID
    为保证OpenProcess函数调用成功,用户所影响的进程必须由上述标志创建。
    一旦用户获得一个进程的有效句柄,就可以调用ReadProcessMemory函数读取该进程的内存:
    BOOL ReadProcessMemory(
    HANDLE hProcess,    // 进程指针 
    LPCVOID lpBaseAddress,    // 数据块的首地址 
    LPVOID lpBuffer,    // 读取数据所需缓冲区
    DWORD cbRead,    // 要读取的字节数
    LPDWORD lpNumberOfBytesRead     
    );
    使用同样的句柄也可以写入该进程的内存:
    BOOL WriteProcessMemory(
    HANDLE hProcess,    // 进程指针 
    LPVOID lpBaseAddress,    // 要写入的首地址 
    LPVOID lpBuffer,    // 缓冲区地址
    DWORD cbWrite,    // 要写的字节数
    LPDWORD lpNumberOfBytesWritten 
    );    
    如下所示是读写另一进程的共享内存中的数据:
    ReadProcessMemory((HANDLE)hTargetProcess,
    (LPSTR)lpsz,m_strGlobal.GetBuffer(_MAX_FIELD),
    _MAX_FIELD,&cb);
    WriteProcessMemory((HANDLE)hTargetProcess,
    (LPSTR)lpsz,(LPSTR)STARS,
    m_strGlobal.GetLength(),&cb);