Web Analytics Made Easy -
StatCounter VB.NET > Read Pointer from Memory - CodingForum

Announcement

Collapse
No announcement yet.

VB.NET > Read Pointer from Memory

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • VB.NET > Read Pointer from Memory

    I found the pointer that points to the value of the characters HP.
    What method in the code can i use to read the pointers value?

    [spoiler]
    Code:
    <?xml version="1.0"?>
    <CheatTable CheatEngineTableVersion="12">
      <CheatEntries>
        <CheatEntry>
          <ID>1</ID>
          <Description>"PSKO Chr: Current HP"</Description>
          <Color>80000008</Color>
          <VariableType>4 Bytes</VariableType>
          <Address>00818794</Address>
          <Offsets>
            <Offset>4A0</Offset>
          </Offsets>
        </CheatEntry>
      </CheatEntries>
      <UserdefinedSymbols/>
    </CheatTable>
    [/spoiler]

    Code:
        Public Function GetCurrentHP()
            Form1.Label2.Text = KOHack.Module1.ReadLongPointer(818794, "4A0", 4)
        End Function
    Module
    [spoiler]
    Code:
    Module Module1
        Public RBuff As Long
        Public RBuff2 As Single
        Public RBuff3 As Integer
        Dim Form1 As KOHack.frmMain
        Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
        Private Declare Function WriteProcessMemory Lib "kernel32" (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 WriteFloatMemory 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 Integer
        Private Declare Function ReadFloat Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByRef buffer As Single, ByVal size As Int32, ByRef lpNumberOfBytesRead As Int32) As Boolean
        Private Declare Function ReadProcessMemory 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 CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
        Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    
        Public Function Writememory(ByVal Address As Integer, ByVal Value As Long, ByVal Bytes As Integer)
            Dim LOLLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If LOLLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, LOLLookUp(0).Id)
            WriteProcessMemory(processHandle, Address, Value, Bytes, Nothing)
            CloseHandle(processHandle)
        End Function
    
        Public Function ReadFloat(ByVal Address As Single)
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing)
            CloseHandle(processHandle)
            Return RBuff
        End Function
    
        Public Function WriteFloat(ByVal Address As Integer, ByVal Value As Single)
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            WriteFloatMemory(processHandle, Address, Value, 4, Nothing)
            CloseHandle(processHandle)
        End Function
    
        Public Function ReadLong(ByVal Address As Integer)
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing)
            CloseHandle(processHandle)
            Return RBuff
        End Function
    
        Public Function ReadFloatPointer(ByVal Base As Integer, ByVal Offset As Short)
            Dim fullAddress As Long
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)
            fullAddress = RBuff + Offset
            ReadFloat(processHandle, fullAddress, RBuff2, 4, Nothing)
            Return RBuff2
            CloseHandle(processHandle)
    
        End Function
    
        Public Function ReadLongPointer(ByVal Base As Integer, ByVal Offset As Short, ByVal Bytes As Integer)
            Dim fullAddress As Long
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)
            fullAddress = RBuff + Offset
            ReadProcessMemory(processHandle, fullAddress, RBuff3, Bytes, Nothing)
            Return RBuff3
            CloseHandle(processHandle)
        End Function
    
        Public Function WriteFloatPointer(ByVal Base As Integer, ByVal Offset As Short, ByVal Value As Single)
            Dim fullAddress As Long
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)
            fullAddress = RBuff + Offset
            WriteFloatMemory(processHandle, fullAddress, Value, 4, Nothing)
            CloseHandle(processHandle)
        End Function
    
        Public Function WriteLongPointer(ByVal Base As Integer, ByVal Offset As Short, ByVal Value As Long, ByVal Bytes As Integer)
            Dim fullAddress As Long
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)
            fullAddress = RBuff + Offset
            WriteProcessMemory(processHandle, fullAddress, Value, Bytes, Nothing)
            CloseHandle(processHandle)
        End Function
    
        Public Function NOP(ByVal Address As Integer, ByVal value As Integer)
            Dim KnightOnLineLookUp As Process() = Process.GetProcessesByName(Form1.txtWindowName.Text)
            If KnightOnLineLookUp.Length < 0 Then
                End
            End If
            Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, KnightOnLineLookUp(0).Id)
            WriteProcessMemory(processHandle, Address, value, 1, Nothing)
            CloseHandle(processHandle)
        End Function
    End Module
    [/spoiler]

    In the code it gets the process by window handle, before it checked if the length of the array containg all processes found by the name was 0, if it was the application would exit. I tried to get the process by PID instead and it worked fine so instead of the equal symbol i did less than ( < 0 ). So im not sure if its correctly attaching now, there are more checks after that, code is below.

    Code...
    [spoiler]
    Code:
    Dim KO As Process() = Process.GetProcessesByName(txtWindowName.Text)
            If KO.Length < 0 Then
                MsgBox("KnightOnline is not running!", MsgBoxStyle.Critical)
                Me.Close()
            Else
                GameWindowHandle = w32.GetWindowHandle(txtWindowName.Text)
                If GameWindowHandle = IntPtr.Zero Then
    
                Else
                    GamePID = w32.GetPID(GameWindowHandle)
                    If GamePID = 0 Then
    
                    Else
                        GameProcessHandle = w32.GetProcessHandle(GamePID)
                        If GameProcessHandle = IntPtr.Zero Then
                            MsgBox("Can not attach to the knightonline client.", MsgBoxStyle.Information)
                        Else
                            MsgBox("Succesfully attached!", MsgBoxStyle.Information)
                            btnStart.Enabled = False
                            Panel1.Enabled = True
                            oThread = New Thread(AddressOf cw.GetCurrentHP)
                            oThread.Start()
                        End If
                    End If
                End If
            End If
    [/spoiler]

    The application just crashes.
    I have the address of the pointer which points to the current characters hp points. I want to resolve the value of the address the pointer is pointing to.
Working...
X
😀
🥰
🤢
😎
😡
👍
👎