vb读写内存求助
用CE以下两个地址都可以正常读取修改,但是用api的话可以正常读取,但是写入就有些可以写入,有些不可以。
实在找不到原因,求解。
模块
Private Declare Function ReadProcessMemory Lib "Kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteProcessMemory Lib "Kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
'------------------------------读取内存开始---------------------------------------------
'读取内存4字节长整数(进程句柄,内存地址)
Function 读取内存4字节长整数(进程句柄 As Long, 内存地址 As String) As Long
Dim 基础地址 As Long
Dim 累加地址 As Long
Dim 最终数值 As Long
Dim hProcess1 As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim 一级偏移 As Long
Dim 二级偏移 As Long
Dim 三级偏移 As Long
Dim 偏移数量 As Integer
sz = Split(内存地址, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
偏移数量 = UBound(sz)
hProcess1 = 进程句柄
'0偏移-读取4字节的静态地址--
If 偏移数量 = 0 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0&
最终数值 = 累加地址
读取内存4字节长整数 = 最终数值
End If
'1偏移-
If 偏移数量 = 1 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
最终数值 = 累加地址
读取内存4字节长整数 = 最终数值
End If
'2偏移-
If 偏移数量 = 2 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 4, 0
最终数值 = 累加地址
读取内存4字节长整数 = 最终数值
End If
'3偏移-
If 偏移数量 = 3 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
三级偏移 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 三级偏移, 累加地址, 4, 0
最终数值 = 累加地址
读取内存4字节长整数 = 最终数值
End If
End Function
'读取内存1字节整数(进程句柄,内存地址)
Function 读取内存1字节整数(进程句柄 As Long, 内存地址 As String) As Byte
Dim 基础地址 As Long
Dim 累加地址 As Long
Dim 最终数值 As Byte
Dim hProcess1 As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim 一级偏移 As Long
Dim 二级偏移 As Long
Dim 三级偏移 As Long
Dim 偏移数量 As Integer
sz = Split(内存地址, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
偏移数量 = UBound(sz)
hProcess1 = 进程句柄
'0偏移-读取4字节的静态地址--
If 偏移数量 = 0 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 1, 0&
最终数值 = 累加地址
读取内存1字节整数 = 最终数值
End If
'1偏移-
If 偏移数量 = 1 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 1, 0
最终数值 = 累加地址
读取内存1字节整数 = 最终数值
End If
'2偏移-
If 偏移数量 = 2 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 1, 0
最终数值 = 累加地址
读取内存1字节整数 = 最终数值
End If
'3偏移-
If 偏移数量 = 3 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
三级偏移 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 1, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 三级偏移, 累加地址, 1, 0
最终数值 = 累加地址
读取内存1字节整数 = 最终数值
End If
End Function
'------------------------------修改内存开始---------------------------------------------
'修改内存4字节长整数(进程句柄,内存地址,写入值)
Function 修改内存4字节长整数(进程句柄 As Long, 内存地址 As String, 写入值 As Long)
Dim 基础地址 As Long
Dim 累加地址 As Long
Dim 最终数值 As Long
Dim hProcess1 As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim 一级偏移 As Long
Dim 二级偏移 As Long
Dim 三级偏移 As Long
Dim 偏移数量 As Integer
sz = Split(内存地址, "]+") '分割字符-把偏移等变为数组元素保存起来
偏移数量 = UBound(sz)
hProcess1 = 进程句柄
'0偏移-读取4字节的静态地址--
If 偏移数量 = 0 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
WriteProcessMemory hProcess1, ByVal 基础地址, 写入值, 4, 0&
End If
'1偏移-
If 偏移数量 = 1 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 写入值, 4, 0
End If
'2偏移-
If 偏移数量 = 2 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 写入值, 4, 0
End If
'3偏移-
If 偏移数量 = 3 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
三级偏移 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 三级偏移, 写入值, 4, 0
End If
End Function
'修改内存1字节短整数
Function 修改内存1字节短整数(进程句柄 As Long, 内存地址 As String, 写入值 As Byte)
Dim 基础地址 As Long
Dim 累加地址 As Long
Dim hProcess1 As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim 一级偏移 As Long
Dim 二级偏移 As Long
Dim 三级偏移 As Long
Dim 偏移数量 As Integer
sz = Split(内存地址, "]+") '分割字符-把偏移等变为数组元素保存起来
'标记符号是 ']+'
偏移数量 = UBound(sz)
hProcess1 = 进程句柄
'0偏移-读取4字节的静态地址--
If 偏移数量 = 0 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
WriteProcessMemory hProcess1, ByVal 基础地址, 写入值, 1, 0&
End If
'1偏移-
If 偏移数量 = 1 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 写入值, 1, 0
End If
'2偏移-
If 偏移数量 = 2 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 写入值, 1, 0
End If
'3偏移-
If 偏移数量 = 3 Then
基础地址 = Val("&H" & Trim(Replace(sz(0), "[", "")))
一级偏移 = Val("&H" & Trim(sz(1)))
二级偏移 = Val("&H" & Trim(sz(2)))
三级偏移 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory hProcess1, ByVal 基础地址, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 一级偏移, 累加地址, 4, 0
ReadProcessMemory hProcess1, ByVal 累加地址 + 二级偏移, 累加地址, 4, 0
WriteProcessMemory hProcess1, ByVal 累加地址 + 三级偏移, 写入值, 1, 0
End If
End Function
Private Sub Command1_Click()
'这个可以正常修改
Call a.修改内存4字节长整数(Spy.进程句柄, "[7a55f24]+1A", txt_minjie.Text)
End Sub
Private Sub Check1_Click()
'这个可以正常读取,写入不正常
MsgBox a.读取内存1字节整数(Spy.进程句柄, "5F9D1A")
If Check1.Value = 1 Then
Dim result As Byte
result = 41 - CInt(lbl_jc.Caption)
Call a.修改内存1字节短整数(Spy.进程句柄, "5F9D1A", result)
End If
End Sub