Option Explicit
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Const PROCESS_VM_READ As Long = &H10
Private Type mtypDataStruct
Pointer As Long
Length As Long
End Type
Dim marBuffer() As Byte
Dim mudtStruct As mtypDataStruct
Public Function ReadMemory(ByVal ProcessID As Long, ByVal Pointer As Long) As Byte()
Dim lngProcessHWND As Long
Dim lngBytesRead As Long
Dim arBuffer() As Byte
Dim udtStruct As mtypDataStruct
lngProcessHWND = OpenProcess(PROCESS_VM_READ, False, ProcessID)
If lngProcessHWND Then
Call ReadProcessMemory(lngProcessHWND, ByVal Pointer, ByVal VarPtr(udtStruct), LenB(udtStruct), lngBytesRead)
ReDim arBuffer(0 To udtStruct.Length - 1) As Byte
Call ReadProcessMemory(lngProcessHWND, ByVal udtStruct.Pointer, ByVal VarPtr(arBuffer(0)), udtStruct.Length, lngBytesRead)
Call CloseHandle(lngProcessHWND)
ReadMemory = arBuffer
CloseHandle lngProcessHWND
End If
End Function
Public Function ReadMemoryFromHWND(ByVal hwnd As Long, ByVal MemAddr As Long) As Byte()
Dim lngProcessID As Long
GetWindowThreadProcessId hwnd, lngProcessID
ReadMemoryFromHWND = ReadMemory(lngProcessID, MemAddr)
End Function
Public Function SendByteArray(ByVal hwnd As Long, ByVal ByteArray As String) As Long
Dim lngRet As Long
marBuffer = ByteArray
With mudtStruct
.Length = UBound(marBuffer) + 1
.Pointer = VarPtr(marBuffer(0))
End With
SendByteArray = SendMessage(hwnd, CUSTOM_MESSAGE, GetCurrentProcessId, mudtStruct)
Erase marBuffer
End Function
Public Sub PostByteArray(ByVal hwnd As Long, ByVal ByteArray As String)
marBuffer = ByteArray
With mudtStruct
.Length = UBound(marBuffer) + 1
.Pointer = VarPtr(marBuffer(0))
End With
Call PostMessage(hwnd, CUSTOM_MESSAGE, GetCurrentProcessId, VarPtr(mudtStruct))
End Sub
Public Function PtrObj(ByVal Pointer As Long) As Object
Dim objObject As Object
CopyMemory objObject, Pointer, 4&
Set PtrObj = objObject
CopyMemory objObject, 0&, 4&
End Function
Public Sub KillProcess(ByVal ProcessName As String)
TerminateEXE ProcessName
End Sub