vb读写内存求助

homexigua 2012-11-15 04:19:19
用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

...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2012-11-20
  • 打赏
  • 举报
回复
图???
嗷嗷叫的老马 2012-11-17
  • 打赏
  • 举报
回复
没用VirtualAllocEx改页面属性为可写啊,那人家页面要是不可写,当然就不行了.

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧