Option Strict On
Imports System.Runtime.InteropServices
Imports System.Text
Module MemoryModule
<DllImport("kernel32.dll")>
Private Function OpenProcess(ByVal dwDesiredAccess As UInteger, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function WriteProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As IntPtr, <Out()> ByRef lpNumberOfBytesWritten As IntPtr) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function ReadProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, <Out()> ByVal lpBuffer() As Byte, ByVal dwSize As IntPtr, ByRef lpNumberOfBytesRead As IntPtr) As Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True)>
Private Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Private Const PROCESS_VM_WRITE As UInteger = &H20
Private Const PROCESS_VM_READ As UInteger = &H10
Private Const PROCESS_VM_OPERATION As UInteger = &H8
Private TargetProcess As String = "t6mp"
Private ProcessHandle As IntPtr = IntPtr.Zero
Private LastKnownPID As Integer = -1
Private Function ProcessIDExists(ByVal pID As Integer) As Boolean
For Each p As Process In Process.GetProcessesByName(TargetProcess)
If p.Id = pID Then Return True
Next
Return False
End Function
Public Sub SetProcessName(ByVal processName As String)
TargetProcess = processName
If ProcessHandle <> IntPtr.Zero Then CloseHandle(ProcessHandle)
LastKnownPID = -1
ProcessHandle = IntPtr.Zero
End Sub
Public Function GetCurrentProcessName() As String
Return TargetProcess
End Function
Public Function UpdateProcessHandle() As Boolean
If LastKnownPID = -1 OrElse Not ProcessIDExists(LastKnownPID) Then
If ProcessHandle <> IntPtr.Zero Then CloseHandle(ProcessHandle)
Dim p() As Process = Process.GetProcessesByName(TargetProcess)
If p.Length = 0 Then Return False
LastKnownPID = p(0).Id
ProcessHandle = OpenProcess(PROCESS_VM_READ Or PROCESS_VM_WRITE Or PROCESS_VM_OPERATION, False, p(0).Id)
If ProcessHandle = IntPtr.Zero Then Return False
End If
Return True
End Function
Public Function ReadMemory(Of T)(ByVal address As Object) As T
Return ReadMemory(Of T)(CLng(address))
End Function
Public Function ReadMemory(Of T)(ByVal address As Integer) As T
Return ReadMemory(Of T)(New IntPtr(address), 0, False)
End Function
Public Function ReadMemory(Of T)(ByVal address As Long) As T
Return ReadMemory(Of T)(New IntPtr(address), 0, False)
End Function
Public Function ReadMemory(Of T)(ByVal address As IntPtr) As T
Return ReadMemory(Of T)(address, 0, False)
End Function
Public Function ReadMemory(ByVal address As IntPtr, ByVal length As Integer) As Byte()
Return ReadMemory(Of Byte())(address, length, False)
End Function
Public Function ReadMemory(ByVal address As Integer, ByVal length As Integer) As Byte()
Return ReadMemory(Of Byte())(New IntPtr(address), length, False)
End Function
Public Function ReadMemory(ByVal address As Long, ByVal length As Integer) As Byte()
Return ReadMemory(Of Byte())(New IntPtr(address), length, False)
End Function
Public Function ReadMemory(Of T)(ByVal address As IntPtr, ByVal length As Integer, ByVal unicodeString As Boolean) As T
Dim buffer() As Byte
If GetType(T) Is GetType(String) Then
If unicodeString Then buffer = New Byte(length * 2 - 1) {} Else buffer = New Byte(length - 1) {}
ElseIf GetType(T) Is GetType(Byte()) Then
buffer = New Byte(length - 1) {}
Else
buffer = New Byte(Marshal.SizeOf(GetType(T)) - 1) {}
End If
If Not UpdateProcessHandle() Then Return Nothing
Dim success As Boolean = ReadProcessMemory(ProcessHandle, address, buffer, New IntPtr(buffer.Length), IntPtr.Zero)
If Not success Then Return Nothing
If GetType(T) Is GetType(Byte()) Then Return CType(CType(buffer, Object), T)
If GetType(T) Is GetType(String) Then
If unicodeString Then Return CType(CType(Encoding.Unicode.GetString(buffer), Object), T)
Return CType(CType(Encoding.ASCII.GetString(buffer), Object), T)
End If
Dim gcHandle As GCHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned)
Dim returnObject As T = CType(Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject, GetType(T)), T)
gcHandle.Free()
Return returnObject
End Function
Private Function GetObjectBytes(ByVal value As Object) As Byte()
If value.GetType() Is GetType(Byte()) Then Return CType(value, Byte())
Dim buffer(Marshal.SizeOf(value) - 1) As Byte
Dim ptr As IntPtr = Marshal.AllocHGlobal(buffer.Length)
Marshal.StructureToPtr(value, ptr, True)
Marshal.Copy(ptr, buffer, 0, buffer.Length)
Marshal.FreeHGlobal(ptr)
Return buffer
End Function
Public Function WriteMemory(Of T)(ByVal address As Object, ByVal value As T) As Boolean
Return WriteMemory(CLng(address), value)
End Function
Public Function WriteMemory(Of T)(ByVal address As Object, ByVal value As Object) As Boolean
Return WriteMemory(CLng(address), CType(value, T))
End Function
Public Function WriteMemory(Of T)(ByVal address As Integer, ByVal value As T) As Boolean
Return WriteMemory(New IntPtr(address), value)
End Function
Public Function WriteMemory(Of T)(ByVal address As Integer, ByVal value As Object) As Boolean
Return WriteMemory(address, CType(value, T))
End Function
Public Function WriteMemory(Of T)(ByVal address As Long, ByVal value As T) As Boolean
Return WriteMemory(New IntPtr(address), value)
End Function
Public Function WriteMemory(Of T)(ByVal address As Long, ByVal value As Object) As Boolean
Return WriteMemory(address, CType(value, T))
End Function
Public Function WriteMemory(Of T)(ByVal address As IntPtr, ByVal value As T) As Boolean
Return WriteMemory(address, value, False)
End Function
Public Function WriteMemory(Of T)(ByVal address As IntPtr, ByVal value As Object) As Boolean
Return WriteMemory(address, CType(value, T), False)
End Function
Public Function WriteMemory(Of T)(ByVal address As Object, ByVal value As T, ByVal unicode As Boolean) As Boolean
Return WriteMemory(CLng(address), value, unicode)
End Function
Public Function WriteMemory(Of T)(ByVal address As Integer, ByVal value As T, ByVal unicode As Boolean) As Boolean
Return WriteMemory(New IntPtr(address), value, unicode)
End Function
Public Function WriteMemory(Of T)(ByVal address As Long, ByVal value As T, ByVal unicode As Boolean) As Boolean
Return WriteMemory(New IntPtr(address), value, unicode)
End Function
Public Function WriteMemory(Of T)(ByVal address As IntPtr, ByVal value As T, ByVal unicode As Boolean) As Boolean
If Not UpdateProcessHandle() Then Return False
Dim buffer() As Byte
If TypeOf value Is String Then
If unicode Then buffer = Encoding.Unicode.GetBytes(value.ToString()) Else buffer = Encoding.ASCII.GetBytes(value.ToString())
Else
buffer = GetObjectBytes(value)
End If
Dim result As Boolean = WriteProcessMemory(ProcessHandle, address, buffer, New IntPtr(buffer.Length), IntPtr.Zero)
Return result
End Function
End Module
If Process.GetProcessesByName("MAT").Length <> 0 Then
Dim num As Integer
Module1.ReadMemoryPointer("MAT", &H1000000, num, New Integer(0 - 1) {})
num = (num + &H1)
Module1.ReadMemoryPointer("MAT", num, num, New Integer(0 - 1) {})
num = (num + &H2C)
Module1.ReadMemoryPointer("MAT", num, num, New Integer(0 - 1) {})
num = (num + &H3C)
Module1.ReadMemoryPointer("MAT", num, num, New Integer(0 - 1) {})
num = (num + &H1234)
Module1.WriteMemoryPointer("MAT", num, 23343, New Integer(0 - 1) {}) '23343 value to write
End If
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.CompilerServices
Imports System
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Public Class Module1
<DllImport("KERNEL32", EntryPoint:="ReadProcessMemory", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function ReadMemoryByte(ByVal Handle As Integer, ByVal Address As Integer, ByRef Value As Byte, Optional ByVal Size As Integer = 1, Optional ByRef BytesRead As Integer = 0) As Byte
End Function
<DllImport("KERNEL32", EntryPoint:="ReadProcessMemory", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function ReadMemoryInteger(ByVal Handle As Integer, ByVal Address As Integer, ByRef Value As Integer, Optional ByVal Size As Integer = 4, Optional ByRef BytesRead As Integer = 0) As Integer
End Function
Public Shared Sub ReadMemoryPointer(ByVal ProcessName As String, ByVal Pointer As Integer, ByRef Value As Integer, ByVal ParamArray OFFSet As Integer())
If (Process.GetProcessesByName(ProcessName).Length <> 0) Then
Dim num4 As Integer
Dim handle As Integer = CInt(Process.GetProcessesByName(ProcessName)(0).Handle)
Dim num2 As Integer
For Each num2 In OFFSet
num4 = 0
Module1.ReadMemoryInteger(handle, Pointer, Pointer, 4, num4)
Pointer = (Pointer + num2)
Next
num4 = 0
Module1.ReadMemoryInteger(handle, Pointer, Value, 4, num4)
End If
End Sub
Public Shared Sub WriteByte(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Byte)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim num As Long = Value
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, num, 1, bytesWritten)
Value = CByte(num)
End If
End Sub
Public Shared Sub WriteDouble(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Double)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim num As Long = CLng(Math****und(Value))
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, num, 8, bytesWritten)
Value = num
End If
End Sub
Public Shared Sub WriteFloat(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Single)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim num As Long = CLng(Math****und(CDbl(Value)))
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, num, 4, bytesWritten)
Value = num
End If
End Sub
Public Shared Sub WriteInteger(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Integer)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim num As Long = Value
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, num, 4, bytesWritten)
Value = CInt(num)
End If
End Sub
Public Shared Sub WriteLong(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Long)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, Value, 8, bytesWritten)
End If
End Sub
Public Shared Sub WriteMemoryASM(ByVal ProcessName As String, ByVal Address As Integer, ByVal Array As Byte())
If (Process.GetProcessesByName(ProcessName).Length <> 0) Then
Dim handle As Integer = CInt(Process.GetProcessesByName(ProcessName)(0).Handle)
Dim num3 As Byte = CByte(Information.UBound(Array, 1))
Dim i As Byte = CByte(Information.LBound(Array, 1))
Do While (i <= num3)
Dim bytesWritten As Integer = 0
Module1.WriteMemoryByte(handle, (Address + i), Array(i), 1, bytesWritten)
i = CByte((i + 1))
Loop
End If
End Sub
<DllImport("KERNEL32", EntryPoint:="WriteProcessMemory", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Private Shared Function WriteMemoryByte(ByVal Handle As Integer, ByVal Address As Integer, ByRef Value As Byte, Optional ByVal Size As Integer = 1, Optional ByRef BytesWritten As Integer = 0) As Byte
End Function
<DllImport("KERNEL32", EntryPoint:="WriteProcessMemory", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Private Shared Function WriteMemoryInteger(ByVal Handle As Integer, ByVal Address As Integer, ByRef Value As Integer, Optional ByVal Size As Integer = 4, Optional ByRef BytesWritten As Integer = 0) As Integer
End Function
Public Shared Sub WriteMemoryPointer(ByVal ProcessName As String, ByVal Pointer As Integer, ByVal Value As Integer, ByVal ParamArray OFFSet As Integer())
If (Process.GetProcessesByName(ProcessName).Length <> 0) Then
Dim num4 As Integer
Dim handle As Integer = CInt(Process.GetProcessesByName(ProcessName)(0).Handle)
Dim num2 As Integer
For Each num2 In OFFSet
num4 = 0
Module1.ReadMemoryInteger(handle, Pointer, Pointer, 4, num4)
Pointer = (Pointer + num2)
Next
num4 = 0
Module1.WriteMemoryInteger(handle, Pointer, Value, 4, num4)
End If
End Sub
Public Shared Sub WriteShort(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Short)
Dim processesByName As Process() = Process.GetProcessesByName(ProcessName)
If (processesByName.Length <> 0) Then
Dim num As Long = Value
Dim bytesWritten As Long = 0
Module1.WriteProcessMemory(CInt(processesByName(0).Handle), Address, num, 2, bytesWritten)
Value = CShort(num)
End If
End Sub
<DllImport("KERNEL32", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Private Shared Function WriteProcessMemory(ByVal Handle As Integer, ByVal Address As Integer, ByRef Value As Long, ByVal Size As Integer, ByRef BytesWritten As Integer) As Long
End Function
End Class