首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

vb读写内存

2013-01-07 
vb读写内存求助用CE以下两个地址都可以正常读取修改,但是用api的话可以正常读取,但是写入就有些可以写入,

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



[解决办法]
没用VirtualAllocEx改页面属性为可写啊,那人家页面要是不可写,当然就不行了.

热点排行