Results 1 to 4 of 4
  1. #1
    zxpwds's Avatar
    Join Date
    Jun 2014
    Gender
    male
    Posts
    5
    Reputation
    10
    Thanks
    0

    VB.NET Memory Module [by master131] help

    (by master131)


    VB.NET Memory Module (by master131)

    Someone originally asked me about how to write a float to memory and when he gave me his code, I immediately facepalmed since the decleration for WriteProcessMemory and ReadProcessMemory were completely wrong. I know it's not his fault because he probably copied from somewhere but here's my take on it.

    It supports ANY 'primitive' value type, the most common one you guys will be using is probably: Integer, Single (Float) and String (string is not a primitive type but it's still supported). You can also read Byte() too (byte array), make sure to indicate how many bytes you want to read though.

    Here's a full list if you're interested: Boolean, Byte, SByte, Int16 (Short), UInt16 (UShort), Int32 (Integer), UInt32 (UInteger), Int64 (Long), UInt64 (ULong), IntPtr, UIntPtr, Char, Double, and Single (Float).
    Here's the code:


    Code:
    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 Const TargetProcess As String = "iw5sp"
            Private ProcessHandle As IntPtr = IntPtr.Zero
            Private LastKnownPID As Integer = -1
    
            Public Function ReadMemory(Of T)(ByVal address As Integer) As T
                Return ReadMemory(Of T)(address, 0, False)
            End Function
    
            Public Function ReadMemory(ByVal address As Integer, ByVal length As Integer) As Byte()
                Return ReadMemory(Of Byte())(address, length, False)
            End Function
    
            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
    
            Private 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 Integer, 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, New IntPtr(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
                returnObject = 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(ByVal address As Integer, ByVal value As Object) As Boolean
                Return WriteMemory(address, value, False)
            End Function
    
            Public Function WriteMemory(ByVal address As Integer, ByVal value As Object, 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, New IntPtr(address), buffer, New IntPtr(buffer.Length), IntPtr.Zero)
                Return result
            End Function
        End Module
    How do I use the code?
    Right-click on your project and Add a new module. Then copy and paste the code from the box into the screen. If you want to use this module on another process, replace "iw5sp" with whatever you want next to 'TargetProcess'.

    I've created a few functions for you guys. To check if a process is running, use the UpdateProcessHandle() function. For example (in a timer):
    Code:
    Code:
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If UpdateProcessHandle() Then ' Check if the game is running
                ' Do stuff here, like writing/reading memory or telling a user in a Label the game is open.
            End If
        End Sub
    Now, here's how to read/write memory using this module:
    Dim myIntValue As Integer = ReadMemory(Of Integer)(&H12345678) ' Reads the value from 0x12345678 as an Integer
    Dim myFloatValue As Single = ReadMemory(Of Single)(&H12345678) ' Reads the value from 0x12345678 as a Single (remember that Single is the same as Float)
    Dim myASCIIStringValue As String = ReadMemory(Of String)(&H12345678, 10, False) ' Reads 10 characters at 0x12345678 as a ASCII String
    Dim myUnicodeStringValue As String = ReadMemory(Of String)(&H12345678, 10, True) ' Reads 10 characters at 0x12345678 as a Unicode String
    Dim myByteData() As Byte = ReadMemory(&H12345678, 12) ' Reads 12 bytes from 0x12345678

    WriteMemory(&H12345678, 10I) ' Writes 10 as an Integer to 0x12345678, take note of the I at the end (it's optional but you can put it there just incase)
    WriteMemory(&H12345678, 0.5F) ' Writes 0.5 as a Single to 0x12345678, take note of the F at the end! (you MUST do this or it will assume it's a Double!)
    WriteMemory(&H12345678, "Hello World", False) ' Writes Hello World as an ASCII string to 0x12345678
    WriteMemory(&H12345678, "Hello World", True) ' Writes Hello World as a Unicode string to 0x12345678
    WriteMemory(&H12345678, New Byte() { &H90, &H90, &H90, &H90 }) ' Writes '0x90, 0x90, 0x90, 0x90' as a byte array to 0x12345678

    How do I write a number into memory if I'm going to get it from a text box?
    It is extremely important that you let VB.NET know what type you want to write into memory otherwise it may assume and you might get some nasty results, here's how you can do it:
    Code:

    Dim valueToWrite As Integer
    If Integer.TryParse(TextBox1.Text, valueToWrite) Then ' Try to convert the text into an Integer
    WriteMemory(&H12345678, valueToWrite)
    End If

    Dim floatValueToWrite As Single
    If Single.TryParse(TextBox2.Text, valueToWrite) Then ' Try convert the text into a Single
    WriteMemory(&H12345678, floatValueToWrite)
    End If

    However, if you are 100% sure that whatever inside a box is a number and not letters you can do this:
    Code:

    WriteMemory(&H12345678, CInt(TextBox1.Text)) ' Writes the value inside a TextBox as a Integer
    WriteMemory(&H12345678, CSng(TextBox2.Text)) ' Writes the value inside a TextBox as a Single

    What's the difference between a ASCII and Unicode string?
    Unicode strings use 2 bytes for every letter it uses and ASCII only uses 1 byte for every letter. If you find a string in memory with Cheat Engine with the Unicode box unticked then it's a ASCII string. If the Unicode box is ticked then it's a Unicode string.

    Hey I'm zxpwd and I came across this source by master131 and I want to thank for helping me out I was searching how
    to NOP an address in vb.net which worked perfectly thanks!




    What I'm having trouble adding a value of 200 to a double type value. You said above:

    WriteMemory(&H12345678, 0.5F) ' Writes 0.5 as a Single to 0x12345678, take note of the F at the end! (you MUST do this or it will assume it's a Double!)

    I left our the F in the WriteMemory(&H12345678, 0.5F)

    so basically here is my code:

    Code:
       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            WriteMemory(&H83F998, 200) ' Writes 0.5 as a Single to 0x12345678, take note of the F at the end! (you MUST do this or it will assume it's a Double!)
     End Sub
    But it does not work. Sorry if this has been covered before but I search and I found nothing.
    Last edited by zxpwds; 06-20-2014 at 10:24 PM.

  2. #2
    Lovroman's Avatar
    Join Date
    Sep 2012
    Gender
    male
    Posts
    9,430
    Reputation
    611
    Thanks
    9,720
    My Mood
    Cheerful
    Do you want to add 200 to the current value or do you want to change the value to 200?
    If you want to add 200, you'll have to get it's value first(using ReadMemory) and then add 200 to it...

  3. #3
    zxpwds's Avatar
    Join Date
    Jun 2014
    Gender
    male
    Posts
    5
    Reputation
    10
    Thanks
    0
    No all i want to do is change the value to 200. But now that you mention it, Both would be good if you can please
    let me know what I need to do. Thanks

  4. #4
    zxpwds's Avatar
    Join Date
    Jun 2014
    Gender
    male
    Posts
    5
    Reputation
    10
    Thanks
    0
    Nobody is going to reply ?

Similar Threads

  1. VB.NET Memory Module v2 by master131 [x86/x64 Compatible]
    By master131 in forum Call of Duty Ghosts Coding & Resources
    Replies: 118
    Last Post: 08-28-2016, 07:18 AM
  2. [Help Request] Vb.net Memory Hacking Problem
    By steveroseik in forum Crossfire Coding Help & Discussion
    Replies: 24
    Last Post: 09-14-2013, 03:41 PM
  3. [Source Code] VB.NET Memory Module (by master131)
    By master131 in forum Call of Duty Modern Warfare 3 Coding, Programming & Source Code
    Replies: 6
    Last Post: 07-09-2013, 10:58 PM
  4. [Release] VB.Net Undetected Module Maker by PheNix
    By PheNix in forum Visual Basic Programming
    Replies: 20
    Last Post: 10-31-2009, 06:38 AM
  5. vb.net (vb2005) module maker or tutorial
    By FrancYescO in forum Visual Basic Programming
    Replies: 0
    Last Post: 04-15-2008, 02:06 AM