Dim a1 As Long
Dim tem As Long
Dim b As Long
a1 = &H73D628
tem = &H60
b = ReadProcessMemory(hwn, a1, tem, 2, 0)
Label2.Caption = b
上边的代码为什么B总是0呀
我用
WriteProcessMemory(hwn, a1, tem, 2, 0)
改不了呀
怎么办
我已经获得进程的最高权利

解决方案 »

  1.   

    ReadProcessMemory是读取指定进程中的内存,要读取的内存区域必须是可访问的,否则失败。
    我不知道你想做什么,我把格式告诉你,你自己看看,有什么问题在回复。
    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
    hProcess是指向被读取内存的进程句柄。(句柄必须有process_vm_read来访问应用程序)
    lpBaseAddress是指向被读取内存的指定进程中的基地址的指针。(在数据传递之前,系统验证基地址中的所有数据和指定的大小的内存是可读的。如果是这种情况,函数继续运行,否则,函数调用失败)
    lpBuffer是指向从指定进程的地址空间接收内容的缓冲区的指针。
    nSize是指定进程中要读取的字节数。
    lpNumberOfBytesWritten是指向传送到指定进程的实际字节数,此参是可选的,如果此参数为NULL则该参数被忽略。注意,任何有process_vm_read访问权的句柄的程序可以调用此函数。被读取的空间必须是可访问的,否则函数返回0值!
      

  2.   

    将ReadProcessMemory、WriteProcessMemory的声明贴出来!还要注意进程的权限!
      

  3.   

    是按地址传递 还是按值传递
    不太明白
    Dim hwn As Long
    Dim hok As Long
    Dim id As LongPrivate Sub Command1_Click()
    Dim a1 As Long
    Dim tem As Long
    Dim b As Long
    a1 = &H73D628
    tem = &H60
    b = ReadProcessMemory(hwn, a1, tem, 2, 0)
    Label2.Caption = b
    CloseHandle (hok)
    'WriteProcessMemory
    End SubPrivate Sub Form_Load()
    Dim a As Stringhwn = FindWindow("HEROsHERO", vbNullString)
    If hwn = False Then
    Label1.Caption = "游戏没有运行"
    Else
    GetWindowThreadProcessId hwn, id
    hok = OpenProcess(process_all_access, 0, id)
    Label1.Caption = "可以修改了"
    End If
    End Sub
    我写的
    可能不对
    改的是武林群侠传钱
    可是我没读到内存中的钱数呀
    还有怎么改
      

  4.   

    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
      

  5.   

    Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As LongDim tem As Long
    b = ReadProcessMemory(hwn, a1, tem, 2, 0)问题应该出在 tem 为 Long 型上,改为 String 就可以了,读出后要用到
    '*****************************
    '字符转换数值
    '*****************************
    Function ConvertStringToNumber(s As String) As Double
    Dim i As Integer
    Dim dblNumber As Double
    dblNumber = 0
    For i = 1 To Len(s)
        dblNumber = Asc(Mid(s, i, 1)) * &H100 ^ (i - 1) + dblNumber
    Next i
    ConvertStringToNumber = dblNumber
    End Function修改游戏的一般方法:
    1、FindWindow
    2、GetWindowThreadProcessId
    3、OpenProcess
    4、ReadProcessMemory 
    5、WriteProcessMemory
    6、适当 goto 4 or 5
    7、CloseHandle