我需要修改某个程序的一个变量。我先用ReadProcessMemory 多次查找得到这个变量的地址是&H40B181。然后用
   WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&
修改成功
    但我想要问的是如果我把那个程序关闭了。另外开过了。是不是我还需要重新再搜索这个地址过啊。。有没有办法可以根据程序进程用个固定的相对地址代替。就象那些专门为某个游戏修改内存的工具一样就是专门修改某个特定程序的某个特定变量。。

解决方案 »

  1.   

    使用 Visual Basic 通过 32 位 地址访问内存    wxj_lake(翻译)  
      http://www.csdn.net/develop/Read_Article.asp?Id=12939使用 Visual Basic 通过 32 位 地址访问内存2001年7月6日马尼拉,菲律宾作者:Chris Vega [[email protected]]  当我们谈论“真的”指针和内存地址,我们大都会想到 Visual Basic 的局限性,比如,由于 VB 没有作为变量声明的指针数据类型,它不能直接访问内存。当某些场合需要一个变量的“地址”而不是它的值的时候,这一点混淆就显得特别明显。例如,那个变量位于内存(当前进程、其它进程或者动态链接库的虚拟空间)中的何处。  是的,VB 确实“没有”指针变量,但是你是否曾试过将一个正规的 VB 数据类型转变为一个指针?你是否认为这是不可能的?好吧,还是再想一下,因为在 Visual Basic 中(从发行版本5开始),Microsoft 提供了一系列便利的函数以将你的正规变量转换为指针,它们是:1] VarPtr - 返回一个变量或者数组元素的地址
       StrPtr - 返回字符串的地址  Visual Basic 中除字符串以外的变量,都位于它的内存位置上,你可以通过调用 VarPtr 函数获取这个变量的地址。字符串实际上是作为 BSTR 储存的,这是一个指向“字符数组的指针”的指针,这样你就需要 StrPtr 以得到“字符数组的指针”的地址,而不是用 VarPtr 获得 BSTR 的地址。范例:
     Dim ptrMyPointer As Long
     Dim intMyInteger As Integer
     Dim strMyString As String * 25 ' 这就是一个调用
     ptrMyPointer = VarPtr(intMyInteger)
     ' 将内存中 intMyInteger 这个变量的32位地址赋予 ptrMyPointer strMyString = "变量的地址:" & Hex(ptrMyPointer)
     MsgBox strMyString
     ' 这是另一个调用
     ptrMyPointer = StrPtr(strMyString)
     ' 给出字符数组首元素的地址,例如,字符串的第一个字母。
    2] VarPtrArray - 返回变量数组的地址
       VarPtrStringArray - 返回字符传数组的地址  Visual Basic 中数组被包存在 SAFEARRAY 结构中,你需要使用 VarPtrArray 函数以获取数组的地址,但是在使用该函数之前,你必须手工把它从 msvbvm50.dll 中声明到 VB 程序中。范例: ' 对于 VB 5
     ' ========
     Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Var() as Any) As Long ' 对于 VB 6
     ' ========
     Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() as Any) As Long  ' 调用 Dim lngSafeArrayAddress As Long
     Dim lngArrayOfLongs(6) As Long
     Dim i As Long Randomize
     For i = 0 to 6
      lngArrayOfLongs = Int(Rnd * &HFFFF)
     Next lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs())  ' 返回数组 lngArrayOfLongs 的安全地址,s of an Array , you
     ' 你可以将这些地址用于快速排序或其它用途。