访问其他应用程序所占的内存空间

首先获取进程ID   然后根据ID创建句柄,读取或者写入内存。呵呵,写得太简单了是吧。  
  http://sanjianxia.myrice.com/vb/112.htm     这个教你怎样获得进程ID  
   
  下面是怎样处理内存  
   
  VirtualQueryEx和ReadProcessMemory/WriteProcessMemory的使用。  
   
  本来只是想看看ReadProcessMemory/WriteProcessMemory函数怎么使用,于是就想到编写一个类似游戏修改器的东西,但搜索4G的地址空间显然不现实,于是求助于VirtualQueryEx。  
   
  先说VirtualQueryEx,这个函数的作用是查询指定进程中某个地址的信息,如哪些内存是空闲的,哪些是被占用区等等,它在VB自带的API浏览器里的声明是  
   
  Public   Declare   Function   VirtualQueryEx   Lib   "kernel32"   Alias   "VirtualQueryEx"   (ByVal   hProcess   As   Long,   lpAddress   As   Any,   lpBuffer   As   MEMORY_BASIC_INFORMATION,   ByVal   dwLength   As   Long)   As   Long  
   
   
  其中lpAddress是要查询的地址值,它用了Any类型,而且是引用传参。这样当然有它的道理,但我需要查某个指定地址(例如0x123456)的信息就显得麻烦了,因为这个参数在C语言里是个void型的指针,这是个32位的值,因此我决定把它改为ByVal   lpAddress   as   Long。  
   
  另外,像MEM_COMMIT   =   &H1000&这些常用的常数在VB自带的API浏览器里居然没有,真是可气!只好自己加了。  
   
  先举个例子吧,看。这个函数是求某个进程占用内存的大小。  
   
  Public   Function   GetTotalCommittedMemory(ByVal   ProcessId   As   Long)   As   Long  
  Dim   hProcess   As   Long  
  Dim   mi   As   MEMORY_BASIC_INFORMATION  
  Dim   pAddr   As   Long  
  Dim   dwTotalCommit   As   Long  
  Dim   ret   As   Long  
  Dim   miLen   As   Long  
  miLen   =   Len(mi)  
  dwTotalCommit   =   0'这是结果  
  pAddr   =   0'这个时查询起始地址,设为0,即进程虚拟地址开始处。  
   
  hProcess   =   OpenProcess(PROCESS_QUERY_INFORMATION,   0,   ProcessId)'首先打开进程供查询信息  
  ret   =   VirtualQueryEx(hProcess,   pAddr,   mi,   miLen)'从起始地址开始查询  
  Do   While   (ret   =   miLen)  
  If   mi.State   =   MEM_COMMIT   Then'如果State是MEM_COMMIT则表明这块内存被占用,RegionSize是这一块内存的大小,这一块内存的State都一样  
  dwTotalCommit   =   dwTotalCommit   +   mi.RegionSize  
  End   If  
  pAddr   =   mi.BaseAddress   +   mi.RegionSize'跳过已经查询过的内存块,到未被查询的内存地址起始处  
  ret   =   VirtualQueryEx(hProcess,   pAddr,   mi,   miLen)'再次查询,直到查询失败(所有可查询地址都已经查过了)  
  Loop  
  GetTotalCommittedMemory   =   dwTotalCommit  
   
  End   Function  
   
  下面再说ReadProcessMemory,这个函数从指定进程中指定地址读出指定长度的内容。它在VB自带的API浏览器里的声明是  
   
  Public   Declare   Function   ReadProcessMemory   Lib   "kernel32"   Alias   "ReadProcessMemory"   (ByVal   hProcess   As   Long,   lpBaseAddress   As   Any,   lpBuffer   As   Any,   ByVal   nSize   As   Long,   lpNumberOfBytesWritten   As   Long)   As   Long  
   
  同样,为了使用方便,lpBaseAddress   As   Any被我改成了ByVal   lpBaseAddress   As   Long,然后讲一下在进程内存里查找数据的技术。  
   
  首先,要打开进程,由于要用ReadProcessMemory读出数据,所以权限要大一些。下面这个打开进程的方式具备了查询、读和写的权限  
   
  hProcess   =   OpenProcess(PROCESS_QUERY_INFORMATION   Or   PROCESS_VM_OPERATION   Or   PROCESS_VM_READ   Or   PROCESS_VM_WRITE,   0,   ProcessId)  
   
  然后就要结合上面的程序来搜索了。只有当内存是处于被占用状态时才去读取其中的内容,而忽略空闲状态的内存。程序我就不在这儿写了,和上面那段差不多。只是把dwTotalCommit   =   dwTotalCommit   +   mi.RegionSize换成了读取内存以及搜索这一块内存的函数而已。  
   
  还有WriteProcessMemory,这个函数向指定进程中指定地址写入指定长度的内容。同样,lpBaseAddress   As   Any被我改成了ByVal   lpBaseAddress   As   Long,这个函数的使用很简单,我就不再赘述了。   
    
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值