你代码太简单了,不好说..... 一般在访问前需要用VirtualQueryEx与VirtualProtectEx函数确保所访问的内存是可访问(可读/写)的这是我一个程序的片段: '读取或写入指定地址lAddr Public Function ReadWriteMemory(ByVal lAddr As Long, buff() As Byte, Optional fRead As Boolean = True, Optional lPID As Long = -1) As Boolean Dim hProcess As Long Dim mi As MEMORY_BASIC_INFORMATION Dim lpAddress As Long, lOldProtect As Long Dim lBytesReadWrite As Long Dim bTmp() As Byte
lpAddress = lAddr If lPID = -1 Then lPID = GetCurrentProcessId End If hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, lPID) If hProcess Then If VirtualQueryEx(hProcess, ByVal lpAddress, mi, Len(mi)) Then If VirtualProtectEx(hProcess, ByVal mi.BaseAddress, mi.RegionSize, PAGE_READWRITE, lOldProtect) <> 0 Then If fRead Then ReadProcessMemory hProcess, ByVal lpAddress, buff(0), UBound(buff) + 1, lBytesReadWrite Else ReDim bTmp(UBound(buff)) ReadProcessMemory hProcess, ByVal lpAddress, bTmp(0), UBound(bTmp) + 1, lBytesReadWrite WriteProcessMemory hProcess, ByVal lpAddress, buff(0), UBound(buff) + 1, lBytesReadWrite CopyMemory buff(0), bTmp(0), UBound(bTmp) + 1 End If Call VirtualProtectEx(hProcess, ByVal mi.BaseAddress, mi.RegionSize, lOldProtect, lOldProtect) ReadWriteMemory = (lBytesReadWrite <> 0) End If End If CloseHandle hProcess End If End Function
一般在访问前需要用VirtualQueryEx与VirtualProtectEx函数确保所访问的内存是可访问(可读/写)的这是我一个程序的片段:
'读取或写入指定地址lAddr
Public Function ReadWriteMemory(ByVal lAddr As Long, buff() As Byte, Optional fRead As Boolean = True, Optional lPID As Long = -1) As Boolean
Dim hProcess As Long
Dim mi As MEMORY_BASIC_INFORMATION
Dim lpAddress As Long, lOldProtect As Long
Dim lBytesReadWrite As Long
Dim bTmp() As Byte
lpAddress = lAddr
If lPID = -1 Then
lPID = GetCurrentProcessId
End If
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, lPID)
If hProcess Then
If VirtualQueryEx(hProcess, ByVal lpAddress, mi, Len(mi)) Then
If VirtualProtectEx(hProcess, ByVal mi.BaseAddress, mi.RegionSize, PAGE_READWRITE, lOldProtect) <> 0 Then
If fRead Then
ReadProcessMemory hProcess, ByVal lpAddress, buff(0), UBound(buff) + 1, lBytesReadWrite
Else
ReDim bTmp(UBound(buff))
ReadProcessMemory hProcess, ByVal lpAddress, bTmp(0), UBound(bTmp) + 1, lBytesReadWrite
WriteProcessMemory hProcess, ByVal lpAddress, buff(0), UBound(buff) + 1, lBytesReadWrite
CopyMemory buff(0), bTmp(0), UBound(bTmp) + 1
End If
Call VirtualProtectEx(hProcess, ByVal mi.BaseAddress, mi.RegionSize, lOldProtect, lOldProtect)
ReadWriteMemory = (lBytesReadWrite <> 0)
End If
End If
CloseHandle hProcess
End If
End Function