Results 1 to 2 of 2
  1. #1
    ViPeR124's Avatar
    Join Date
    Dec 2012
    Gender
    male
    Posts
    41
    Reputation
    10
    Thanks
    1,073
    My Mood
    Cool

    Write Process Memory Class

    Hey Guys,
    I'm working on a new Hack for MW3 and i am using a new Class to write into the memory of the game.
    All works but the class is missing a function to write strings.
    Here is the class:
    Code:
    Imports System.Text
    Imports System.Runtime.InteropServices
    
    Module Memory
        Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
    
        Private Declare Function WriteProcessMemory1 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
        Private Declare Function WriteProcessMemory2 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Single
        Private Declare Function WriteProcessMemory3 Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Long
    
        Private Declare Function ReadProcessMemory1 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
        Private Declare Function ReadProcessMemory2 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Single, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Single
        Private Declare Function ReadProcessMemory3 Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Long, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Long
    
        Const PROCESS_ALL_ACCESS = &H1F0FF
        Public Function WriteDMAInteger(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Integer, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadInteger(Process, lvl, nsize) + Offsets(i - 1)
                Next
                WriteInteger(Process, lvl, Value, nsize)
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
    
        Public Function ReadDMAInteger(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Integer
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadInteger(Process, lvl, nsize) + Offsets(i - 1)
                Next
                Dim vBuffer As Integer
                vBuffer = ReadInteger(Process, lvl, nsize)
                Return vBuffer
            Catch ex As Exception
    
            End Try
        End Function
    
        Public Function WriteDMAFloat(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Single, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadFloat(Process, lvl, nsize) + Offsets(i - 1)
                Next
                WriteFloat(Process, lvl, Value, nsize)
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
    
        Public Function ReadDMAFloat(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Single
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadFloat(Process, lvl, nsize) + Offsets(i - 1)
                Next
                Dim vBuffer As Single
                vBuffer = ReadFloat(Process, lvl, nsize)
                Return vBuffer
            Catch ex As Exception
    
            End Try
        End Function
    
        Public Function WriteDMALong(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Value As Long, ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Boolean
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadLong(Process, lvl, nsize) + Offsets(i - 1)
                Next
                WriteLong(Process, lvl, Value, nsize)
                Return True
            Catch ex As Exception
                Return False
            End Try
        End Function
    
        Public Function ReadDMALong(ByVal Process As String, ByVal Address As Integer, ByVal Offsets As Integer(), ByVal Level As Integer, Optional ByVal nsize As Integer = 4) As Long
            Try
                Dim lvl As Integer = Address
                For i As Integer = 1 To Level
                    lvl = ReadLong(Process, lvl, nsize) + Offsets(i - 1)
                Next
                Dim vBuffer As Long
                vBuffer = ReadLong(Process, lvl, nsize)
                Return vBuffer
            Catch ex As Exception
    
            End Try
        End Function
    
        Public Sub WriteNOPs(ByVal ProcessName As String, ByVal Address As Long, ByVal NOPNum As Integer)
            Dim C As Integer
            Dim B As Integer
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Sub
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Sub
            End If
    
            B = 0
            For C = 1 To NOPNum
                Call WriteProcessMemory1(hProcess, Address + B, &H90, 1, 0&)
                B = B + 1
            Next C
        End Sub
    
        Public Sub WriteXBytes(ByVal ProcessName As String, ByVal Address As Long, ByVal Value As String)
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Sub
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Sub
            End If
    
            Dim C As Integer
            Dim B As Integer
            Dim D As Integer
            Dim V As Byte
    
            B = 0
            D = 1
            For C = 1 To Math****und((Len(Value) / 2))
                V = Val("&H" & Mid$(Value, D, 2))
                Call WriteProcessMemory1(hProcess, Address + B, V, 1, 0&)
                B = B + 1
                D = D + 2
            Next C
    
        End Sub
    
        Public Sub WriteInteger(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Integer, Optional ByVal nsize As Integer = 4)
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Sub
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Sub
            End If
    
            Dim hAddress, vBuffer As Integer
            hAddress = Address
            vBuffer = Value
            WriteProcessMemory1(hProcess, hAddress, CInt(vBuffer), nsize, 0)
        End Sub
    
        Public Sub WriteFloat(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Single, Optional ByVal nsize As Integer = 4)
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Sub
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Sub
            End If
    
            Dim hAddress As Integer
            Dim vBuffer As Single
    
            hAddress = Address
            vBuffer = Value
            WriteProcessMemory2(hProcess, hAddress, vBuffer, nsize, 0)
        End Sub
    
        Public Sub WriteLong(ByVal ProcessName As String, ByVal Address As Integer, ByVal Value As Long, Optional ByVal nsize As Integer = 4)
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Sub
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Sub
            End If
    
            Dim hAddress As Integer
            Dim vBuffer As Long
    
            hAddress = Address
            vBuffer = Value
            WriteProcessMemory3(hProcess, hAddress, vBuffer, nsize, 0)
        End Sub
    
        Public Function ReadInteger(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Integer
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Function
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Function
            End If
    
            Dim hAddress, vBuffer As Integer
            hAddress = Address
            ReadProcessMemory1(hProcess, hAddress, vBuffer, nsize, 0)
            Return vBuffer
        End Function
    
        Public Function ReadFloat(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Single
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Function
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPatr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Function
            End If
    
            Dim hAddress As Integer
            Dim vBuffer As Single
    
            hAddress = Address
            ReadProcessMemory2(hProcess, hAddress, vBuffer, nsize, 0)
            Return vBuffer
        End Function
    
        Public Function ReadLong(ByVal ProcessName As String, ByVal Address As Integer, Optional ByVal nsize As Integer = 4) As Long
            If ProcessName.EndsWith(".exe") Then
                ProcessName = ProcessName.Replace(".exe", "")
            End If
            Dim MyP As Process() = Process.GetProcessesByName(ProcessName)
            If MyP.Length = 0 Then
                MessageBox.Show(ProcessName & " isn't open!")
                Exit Function
            End If
            Dim hProcess As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, MyP(0).Id)
            If hProcess = IntPtr.Zero Then
                MessageBox.Show("Failed to open " & ProcessName & "!")
                Exit Function
            End If
    
            Dim hAddress As Integer
            Dim vBuffer As Long
    
            hAddress = Address
            ReadProcessMemory3(hProcess, hAddress, vBuffer, nsize, 0)
            Return vBuffer
        End Function
    
    End Module
    Can someone help me to add this function?

  2. #2
    abuckau907's Avatar
    Join Date
    Dec 2012
    Gender
    male
    Location
    other side of the wire
    Posts
    1,342
    Reputation
    162
    Thanks
    239
    My Mood
    Cold
    I just copy-pasted this from a project I released here on mpgh a few months ago (probably like page 3-4 if you care to read..)
    Code:
          
      Public Function WriteAsciiString(ByVal addr As IntPtr, ByVal str As String, ByRef actualBytesWritten As UInt32) As Boolean
                Dim _bytes() As Byte = System.Text.Encoding.ASCII.GetBytes(str)
                Return WinAPI.WriteProcessMemory(_targetProcessHandle, addr, _bytes, _bytes.Length, New Int32)
            End Function
    Code:
            Public Function WriteUnicodeString(ByVal addr As IntPtr, ByVal str As String) As Boolean
                Dim _bytes() As Byte = System.Text.Encoding.Unicode.GetBytes(str)
                Return WinAPI.WriteProcessMemory(_targetProcessHandle, addr, _bytes, _bytes.Length, New Int32) ' System.Text.Encoding.Unicode.GetBytes(str)
            End Function
    But the way you overload ReadProcessMemory and WriteProcessMemory is just plain strange. I guess you could overload it again and then make a "ReadBytes" and "WriteBytes" function, passing in the _bytes you get from System.Text.Encoding.**.GetBytes()

    edit: https://pastebin.com/nzZsBPTg
    Last edited by abuckau907; 08-29-2013 at 05:54 AM.
    'Some things that can be counted, don't matter. And some things that matter, can't be counted' - A.E.
    --
     

    My posts have some inaccuracies/are wrong/wrong keyword(s) used.
    They're (maybe) pretty close, and I hope they helped you, not created confusion. Take with grain of salt.

    -if you give rep, please leave a comment, else it means less.

Similar Threads

  1. [Help] Memory editing (Read/Write Process Memory)
    By wolfguardiann in forum Visual Basic Programming
    Replies: 31
    Last Post: 06-04-2011, 03:23 AM
  2. [Help] Write protected memory.
    By pyton789 in forum Visual Basic Programming
    Replies: 16
    Last Post: 04-25-2011, 10:10 PM
  3. [Help]Write memory[Solved]
    By pyton789 in forum Visual Basic Programming
    Replies: 5
    Last Post: 02-08-2011, 01:06 AM
  4. [Help] Write Process Memory
    By tremaster in forum Visual Basic Programming
    Replies: 6
    Last Post: 03-22-2010, 03:28 PM
  5. How Do I Write ASM To A Process?
    By radnomguywfq3 in forum C++/C Programming
    Replies: 12
    Last Post: 12-11-2007, 09:13 PM