HANDLE handle = OpenProcess(
           id,//要被打开的进程的ID
           TRUE,//当前要R/W的进程的子进程也可使用此HANDLE
           PROCESS_VM_READ|//打开此句柄的进程可以Read内存
           PROCESS_VM_WRITE)//打开此句柄的进程可以Write内存
DWORD dwWantRead = 1024,dwHaveRead;
LPBYTE lpBuf = new BYTE[dwWantRead];
BOOL ret =ReadProcessMemory(handle,
                  00A61305,//基址
                   lpBuf,
                   dwWantRead,
                   &dwHaveRead)
if(!ret)
{
   //出错处理;
}
....//修改数据lpbuf
DWORD dwWantWrite= 1024,dwHaveWrite;
BOOL ret =WriteProcessMemory(handle,
                  00A61305,//基址
                   lpBuf,
                   dwWantWrite,
                   &dwHaveWrite)
if(!ret)
{
   //出错处理;
}
delete []lpBuf;
Closehandle(handle)
试试看有问题MAIL给我

解决方案 »

  1.   

    BOOL ret =WriteProcessMemory(handle,
                      00A61305,//基址
                      lpBuf,
                      dwWantWrite,
                      &dwHaveWrite)
    这一行编译没通过
      

  2.   

    00A61305是一个16进制的数,前面要用0x,即0x00A61305
      

  3.   

    操作别的进程的内存:
    1.用Process32First和Process32Next可以玫举所有的进程(Window95/98实现了,WINNT4.0以及一下没有实现,Win2000实现了,如果是用NT4的话,就比较麻烦了,要用Performanance Data,太麻烦了,不说了。)
    2.用VirtualQueryEx可以得到一个进程的内存的信息,如开始地址等(95/98/NT4/2000都实现了,就NT3.5没实现,要自己写,很麻烦的,不说了。)
    3.然后用ReadProcessMemory和WriteProcessMemory就可以实现对某一进程内存的修改,这两个函数95/98/NT4/2000都实现了,读和写的方式是通过ReadPorcessMemory将内存块读到本进程中,就是在本进程上的一个拷贝,然后对这个拷贝执行各种操作,反正是在本进程中地一个拷贝(本进程中的一片内存),随你怎么操作啦,再将内存块用WriteProcessMemory写回去,就实现了对该内存数据的修改,象金山游侠、FPE那样的操作实际都是先对在本进程中的拷贝进行操作,然后将拷贝写回去。
    操作别的进程的内存:
    1.用Process32First和Process32Next可以玫举所有的进程(Window95/98实现了,WINNT4.0以及一下没有实现,Win2000实现了,如果是用NT4的话,就比较麻烦了,要用Performanance Data,太麻烦了,不说了。)
    2.用VirtualQueryEx可以得到一个进程的内存的信息,如开始地址等(95/98/NT4/2000都实现了,就NT3.5没实现,要自己写,很麻烦的,不说了。)
    3.然后用ReadProcessMemory和WriteProcessMemory就可以实现对某一进程内存的修改,这两个函数95/98/NT4/2000都实现了,读和写的方式是通过ReadPorcessMemory将内存块读到本进程中,就是在本进程上的一个拷贝,然后对这个拷贝执行各种操作,反正是在本进程中地一个拷贝(本进程中的一片内存),随你怎么操作啦,再将内存块用WriteProcessMemory写回去,就实现了对该内存数据的修改,象金山游侠、FPE那样的操作实际都是先对在本进程中的拷贝进行操作,然后将拷贝写回去。
      

  4.   

    操作别的进程的内存:
    1.用Process32First和Process32Next可以玫举所有的进程(Window95/98实现了,WINNT4.0以及一下没有实现,Win2000实现了,如果是用NT4的话,就比较麻烦了,要用Performanance Data,太麻烦了,不说了。)
    2.用VirtualQueryEx可以得到一个进程的内存的信息,如开始地址等(95/98/NT4/2000都实现了,就NT3.5没实现,要自己写,很麻烦的,不说了。)
    3.然后用ReadProcessMemory和WriteProcessMemory就可以实现对某一进程内存的修改,这两个函数95/98/NT4/2000都实现了,读和写的方式是通过ReadPorcessMemory将内存块读到本进程中,就是在本进程上的一个拷贝,然后对这个拷贝执行各种操作,反正是在本进程中地一个拷贝(本进程中的一片内存),随你怎么操作啦,再将内存块用WriteProcessMemory写回去,就实现了对该内存数据的修改,象金山游侠、FPE那样的操作实际都是先对在本进程中的拷贝进行操作,然后将拷贝写回去。
      

  5.   

    WIN32一共有4GB的虚存空间,其中用户进程占有2GB。从每个进程自己的角度来看,它都是独占2GB的,正是因为这个原因,每个进程都要单独加载自己的DLL,而在Win3.1下各个进程师共享DLL的。    WinNT 下用户拥有2GB的专用地址,操作系统占用2GB空间分配如下。在用户的2GB空间中,在开始有64KB和结束有2个64KB用于昨为内存的分界区域,是不能访问的,如你访问0的地址是非法的,就是这个原因。这样呢只能访问2GB减去192KB的空间,从0x10000到0x7FFEFFFF的范围。这也就是你的每个进程的能访问的开始和结束地址。    Windows 95/98下,给每个进程分配2GB的专用地址,把剩余的2GB分为系统空间(1GB)和用于所有的共享内存区域的单个共享空间(1GB);这1GB的共享区域对于用户态是可写的,任何进程都可以写道共享内存区域或者映射文件。所以不安全;而WINNT在这点上是不一样的,他将共享内存放在装用的进程地址空间,避免了这个问题。因为没有95/98没有提供分解区域,所以访问的区域就是从000000000到7FFFFFFF的范围,也就是你要求的开始和结束地址。象FPE等游戏修改工具就是利用了这个原理
      

  6.   


     湮模疑! 
     苤萊試符珩晤祒祥徹 ReadProcessMemory 腔菴媼跺曹杅,  "LPCVOID lpBaseAddress, // address to start reading"  
      
      扂蚚 ULONG, DWORD, 0x00A61305 飲岆船祥嗣佽祥夔蛌遙峈 const void *  error C2664: 'ReadProcessMemory' : cannot convert parameter 2 from 'const int' to 'const void *'
      Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
      Generating Code...  恀捲蠅猁睡酕!覜慾!
      

  7.   


     大家好! 
     小弟剛才也編譯不過 ReadProcessMemory 的第二個變數,  "LPCVOID lpBaseAddress, // address to start reading"  
      
      我用 ULONG, DWORD, 0x00A61305 都是差不多說不能轉換為 const void *  error C2664: 'ReadProcessMemory' : cannot convert parameter 2 from 'const int' to 'const void *'
      Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
      Generating Code...  請問前輩們要如何做!感激!