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
Private Declare Function VirtualProtect Lib "kernel32" (ByRef lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long '设置内存可读写
Private Const PAGE_EXECUTE_READWRITE = &H40 ' PAGE_EXECUTE_READWRITE 表示可读可写
Private Declare Function VirtualQueryEx Lib "kernel32" (ByVal hProcess As Long, ByVal lpAddress As Long, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long '搜索内存
Private Type MEMORY_BASIC_INFORMATION
BaseAddress As Long
AllocationBase As Long
AllocationProtect As Long
RegionSize As Long
State As Long
Protect As Long
lType As Long
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const PROCESS_ALL_ACCESS = &H1F0FFF
'设置内存属性,1可读写,其他恢复原样
Function SetMem(ByVal addr As String, ByVal lens As Integer, Optional Stype As Integer = 1)
Select Case Stype
Case 1:
VirtualProtect ByVal addr, lens, PAGE_EXECUTE_READWRITE, OldProtect '修改内存属性
Case Else:
VirtualProtect ByVal addr, lens, OldProtect, OldProtect '恢复内存属性
End Select
End Function
'搜索内存(句柄,开始地址,结束地址,比较方式,搜索类型) 比较方式:1精确数值 2大于 3小于 4两数之间 搜索类型:0 16进制,1 1字节整数,2 2字节整数,3 4字节整数, 4 4字节浮点数
Function SearchMem(ByVal mhwnd As Long, ByVal svalue As String, Optional beginaddr As String = "&H400000", Optional endaddr As String = "&H7FFFFFFF", Optional SearchStyle As Integer = 1, Optional Stype As Integer = 3) As String
Const PAGE_READWRITE = 4, MEM_COMMIT = &H1000
Dim i As Long, j As Long, count As Long
Dim r As Long, mbi As MEMORY_BASIC_INFORMATION
Dim lpAddress As Long: lpAddress = beginaddr
Dim bSearch() As Byte
Dim ubs As Long
Dim kx As Long
bSearching = True
nCountX = 0
r = VirtualQueryEx(mhwnd, lpAddress, mbi, Len(mbi))
'将7FFFFFFF作为搜索结束地址
Dim lpBuffer() As Byte
'字符串转数组
Dim sp() As String
Dim tmp As Long
Dim nLength As Long
'搜索支持数据串,每个数据用逗号分开,如123,234,5,9
sp = Split(svalue, ",")
nLength = UBound(sp)
If Stype = 0 Then sp(0) = CLng("&H" & svalue)
If Stype = 1 Then ' 1字节
ReDim bSearch(nLength)
For i = 0 To nLength
bSearch(i) = Val(sp(i)) And &HFF '防止溢出错误
Next
ElseIf Stype = 2 Then ' 2字节
ReDim bSearch((nLength + 1) * 2 - 1)
For i = 0 To nLength
tmp = Val(sp(i))
CopyMemory bSearch(i * 2), tmp, 2
Next
ElseIf Stype = 3 Then ' 4字节
ReDim bSearch((nLength + 1) * 4 - 1)
For i = 0 To nLength
tmp = Val(sp(i))
CopyMemory bSearch(i * 4), tmp, 4
Next
Else
ReDim bSearch((nLength + 1) * 4 - 1)
Dim tmp_f As Single
For i = 0 To nLength
tmp_f = CSng(sp(i))
CopyMemory bSearch(i * 4), tmp_f, 4
Next
End If
ubs = UBound(bSearch)
If SearchStyle = 1 Then
Do While (r And (lpAddress < CLng(endaddr)) And bSearching)
'只搜索可读取的已提交的内存区域
If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
ReDim lpBuffer(mbi.RegionSize - 1)
ReadProcessMemory mhwnd, ByVal mbi.BaseAddress, lpBuffer(0), mbi.RegionSize, 0&
For i = 0 To mbi.RegionSize - 1 - ubs '防止越界
'逐个字节比较,如果有任何一个不相等,则不再比较其它
For j = 0 To ubs
If bSearch(j) <> lpBuffer(i + j) Then GoTo a10
Next
nCountX = nCountX + 1
SearchMem = SearchMem & Hex(i + lpAddress) & "|"
a10:
Next
End If
lpAddress = lpAddress + mbi.RegionSize '搜索下一条
r = VirtualQueryEx(mhwnd, lpAddress, mbi, Len(mbi))
Loop
End If
If SearchStyle = 2 Then
Do While (r And (lpAddress < CLng(endaddr)) And bSearching)
'只搜索可读取的已提交的内存区域
If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
ReDim lpBuffer(mbi.RegionSize - 1)
ReadProcessMemory mhwnd, ByVal mbi.BaseAddress, lpBuffer(0), mbi.RegionSize, 0&
For i = 0 To mbi.RegionSize - 1 - ubs '防止越界
'逐个字节比较,如果有任何一个不相等,则不再比较其它
For j = 0 To ubs
If bSearch(j) <= lpBuffer(i + j) Then GoTo b10
Next
nCountX = nCountX + 1
SearchMem = SearchMem & Hex(i + lpAddress) & "|"
b10:
Next
End If
lpAddress = lpAddress + mbi.RegionSize
r = VirtualQueryEx(mhwnd, lpAddress, mbi, Len(mbi))
Loop
End If
If SearchStyle = 3 Then
Do While (r And (lpAddress < CLng(endaddr)) And bSearching)
'只搜索可读取的已提交的内存区域
If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
ReDim lpBuffer(mbi.RegionSize - 1)
ReadProcessMemory mhwnd, ByVal mbi.BaseAddress, lpBuffer(0), mbi.RegionSize, 0&
For i = 0 To mbi.RegionSize - 1 - ubs '防止越界
'逐个字节比较,如果有任何一个不相等,则不再比较其它
For j = 0 To ubs
If bSearch(j) >= lpBuffer(i + j) Then GoTo c10
Next
nCountX = nCountX + 1
SearchMem = SearchMem & Hex(i + lpAddress) & "|"
c10:
Next
End If
lpAddress = lpAddress + mbi.RegionSize
r = VirtualQueryEx(mhwnd, lpAddress, mbi, Len(mbi))
Loop
End If
If SearchStyle = 4 Then
Do While (r And (lpAddress < CLng(endaddr)) And bSearching)
'只搜索可读取的已提交的内存区域
If (mbi.Protect And PAGE_READWRITE) And (mbi.State = MEM_COMMIT) Then
ReDim lpBuffer(mbi.RegionSize - 1)
ReadProcessMemory mhwnd, ByVal mbi.BaseAddress, lpBuffer(0), mbi.RegionSize, 0&
For i = 0 To mbi.RegionSize - 1 - ubs '防止越界
If lpBuffer(i) <= Val(txtValue2Search1) Or lpBuffer(i) >= Val(txtValue2Search2) Then GoTo d10
nCountX = nCountX + 1
SearchMem = SearchMem & Hex(i + lpAddress) & "|"
d10:
Next
End If
lpAddress = lpAddress + mbi.RegionSize
r = VirtualQueryEx(mhwnd, lpAddress, mbi, Len(mbi))
Loop
End If
SearchMem = Left(SearchMem, Len(SearchMem) - 1)
bSearching = False
End Function
'字节集
Private Function newHEX(str2 As String) As Long
Dim i As Long, a As Variant, k As Long
k = 0
For i = Len(str2) - 1 To 0 Step -1
a = Asc(LCase(Mid(str2, Len(str2) - i, 1)))
a = IIf(a >= 48 And a <= 57, a - 48, a - 87)
k = k + (16 ^ i) * a
Next
newHEX = k
End Function
'------------------------------读取内存开始---------------------------------------------
'读取指定地址的整数数值,类型可以是2--1字节,1--2字节 或者 0--4字节,默认4字节
Function ReadInt(mhwnd As Long, addr As String, Optional Stype As Integer = 0)
Dim jz As Long '基址
Dim lresult As Long '累加地址
Dim mHprocess As Long '句柄
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long '一级偏移
Dim p2 As Long '二级偏移
Dim p3 As Long '三级偏移
Dim psum As Integer '偏移数量
Dim s As Integer '类型
Dim result As Long '最终结果
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
Select Case Stype
Case 0:
s = 4 '4字节
result = CLng(result)
Case 1:
s = 2 '2字节
result = CInt(result)
Case 2:
s = 1 '1字节
result = CByte(result)
Case Else
s = 4 '4字节
result = CLng(result)
End Select
'0偏移-读取静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory mHprocess, ByVal jz, lresult, s, 0&
result = lresult
ReadInt = result
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, s, 0
result = lresult
ReadInt = result
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, s, 0
result = lresult
ReadInt = result
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, s, 0
ReadProcessMemory mHprocess, ByVal lresult + p3, lresult, s, 0
result = lresult
ReadInt = result
End If
End Function
'读取指定地址的双精度浮点数
Function ReadDouble(mhwnd As Long, addr As String) As Double
Dim jz As Long '基址
Dim lresult As Long '累加地址
Dim result As Long '最终结果
Dim mHprocess As Long '句柄
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long '一级偏移
Dim p2 As Long '二级偏移
Dim p3 As Long '三级偏移
Dim psum As Integer '偏移数量
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory mHprocess, ByVal jz, lresult, 8, 0&
result = lresult
ReadDouble = result
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 8, 0
result = lresult
ReadDouble = result
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 8, 0
result = lresult
ReadDouble = result
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p3, lresult, 8, 0
result = lresult
ReadDouble = result
End If
End Function
'读取指定地址的单精度浮点数
Function ReadFloat(mhwnd As Long, addr As String) As Single
Dim jz As Long '基址
Dim lresult As Long '累加地址
Dim result As Long '最终结果
Dim mHprocess As Long '句柄
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long '一级偏移
Dim p2 As Long '二级偏移
Dim p3 As Long '三级偏移
Dim psum As Integer '偏移数量
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0&
result = lresult
ReadFloat = result
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
result = lresult
ReadFloat = result
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
result = lresult
ReadFloat = result
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p3, lresult, 4, 0
result = lresult
ReadFloat = result
End If
End Function
'读取指定地址的GBK字符串
Function ReadString(mhwnd As Long, addr As String) As String
Dim jz As Long '基址
Dim lresult As Long '累加地址
Dim result(64) As Byte '最终结果
Dim mHprocess As Long '句柄
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long '一级偏移
Dim p2 As Long '二级偏移
Dim p3 As Long '三级偏移
Dim psum As Integer '偏移数量
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory mHprocess, ByVal jz, result(0), 64, 0&
ReadString = StrConv(result, vbUnicode)
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, result(0), 64, 0
ReadString = StrConv(result, vbUnicode)
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, result(0), 64, 0
ReadString = StrConv(result, vbUnicode)
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p3, result(0), 64, 0
ReadString = StrConv(result, vbUnicode)
End If
End Function
'读取指定地址的Unicode字符串
Function ReadStringU(mhwnd As Long, addr As String) As String
Dim jz As Long
Dim lresult As Long
Dim result(64) As Byte
Dim mHprocess As Long
Dim StringU As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long
Dim p2 As Long
Dim p3 As Long
Dim psum As Integer
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来,标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
ReadProcessMemory mHprocess, ByVal jz, StringU, 4, 0
ReadProcessMemory mHprocess, ByVal StringU, result(0), 64, 0&
ReadStringU = result
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, StringU, 4, 0
ReadProcessMemory mHprocess, ByVal StringU, result(0), 64, 0&
ReadStringU = result
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, StringU, 4, 0
ReadProcessMemory mHprocess, ByVal StringU, result(0), 64, 0&
ReadStringU = result
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p3, StringU, 4, 0
ReadProcessMemory mHprocess, ByVal StringU, result(0), 64, 0&
ReadStringU = result
End If
End Function
'------------------------------修改内存开始---------------------------------------------
'对指定地址写入整数数值,类型可以是1字节,2字节 或者 4字节
Function WriteInt(mhwnd As Long, addr As String, v As Long, Optional Stype As Integer = 0)
Dim jz As Long
Dim lresult As Long
Dim mHprocess As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long
Dim p2 As Long
Dim p3 As Long
Dim psum As Integer
Dim s As Integer
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来
psum = UBound(sz)
mHprocess = mhwnd
Select Case Stype
Case 0:
s = 4 '4字节
Case 1:
s = 2 '2字节
Case 2:
s = 1 '1字节
Case Else
s = 4 '4字节
End Select
'0偏移-读取静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
WriteProcessMemory mHprocess, ByVal jz, v, s, 0&
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p1, v, s, 0
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p2, v, s, 0
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p3, v, s, 0
End If
End Function
'对指定地址写入单精度浮点数
Function WriteFloat(mhwnd As Long, addr As String, v As Single)
Dim jz As Long
Dim lresult As Long
Dim mHprocess As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long
Dim p2 As Long
Dim p3 As Long
Dim psum As Integer
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来
'标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
WriteProcessMemory mHprocess, ByVal jz, v, 4, 0&
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p1, v, 4, 0
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p2, v, 4, 0
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p3, v, 4, 0
End If
End Function
'对指定地址写入双精度浮点数
Function WriteDouble(mhwnd As Long, addr As String, v As Double)
Dim jz As Long
Dim lresult As Long
Dim mHprocess As Long
Dim sz '这个是字符数组--为了拆分 指针
Dim p1 As Long
Dim p2 As Long
Dim p3 As Long
Dim psum As Integer
sz = Split(addr, "]+") '分割字符-把偏移等变为数组元素保存起来
'标记符号是 ']+'
psum = UBound(sz)
mHprocess = mhwnd
'0偏移-读取4字节的静态地址--
If psum = 0 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
WriteProcessMemory mHprocess, ByVal jz, v, 8, 0&
End If
'1偏移-
If psum = 1 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p1, v, 8, 0
End If
'2偏移-
If psum = 2 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p2, v, 8, 0
End If
'3偏移-
If psum = 3 Then
jz = Val("&H" & Trim(Replace(sz(0), "[", "")))
p1 = Val("&H" & Trim(sz(1)))
p2 = Val("&H" & Trim(sz(2)))
p3 = Val("&H" & Trim(sz(3))) '最后的偏移
ReadProcessMemory mHprocess, ByVal jz, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p1, lresult, 4, 0
ReadProcessMemory mHprocess, ByVal lresult + p2, lresult, 4, 0
WriteProcessMemory mHprocess, ByVal lresult + p3, v, 8, 0
End If
End Function
'对指定地址写入二进制数据
Public Function WriteData(mhwnd As Long, Maddr As String, Mcode As String) As Long
Dim i As Long, OPcode As String, addr As Long
OPcode = Mcode
addr = newHEX(Maddr)
ReDim AsmCode(Len(OPcode) / 2 - 1) As Byte
For i = 0 To UBound(AsmCode)
AsmCode(i) = CByte("&H" & Mid(OPcode, i * 2 + 1, 2))
Next
WriteProcessMemory mhwnd, ByVal addr, AsmCode(0), UBound(AsmCode) + 1, 0
End Function
'------------------------------------修改内存结束-------------------------------------------------