VB2010 problem mit nicht statische adresse.

10/30/2012 16:22 Xiantrius#1
Ich bin gerade dabei für ein Spiel ein Testtrainer zu bauen.
Nun komme ich aber nicht klar und irgendwas stimmt nicht.

Habe Windows 7 64bit so wie auch Windows XP 32bit daran liegt es leider nicht.
Der spuckt dauernd Wert4 raus obwohl Cheat Engine ein anderen Wert rausspuckt bei der Ziel Adresse die aber über ein Pointer läuft.
Die Adresse ist nicht statisch wollte ich noch hinzufügen.
Langsam hab ich den Eindruck das er von der Base Adresse immer den Wert4 raus spuckt.
Was er aber raus spucken soll ist von der Ziel Adresse den Wert auslesen.
Schaut euch bitte den Code genau an.

Hier das Module:
Code:
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 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 RBuff As Long
    Public RBuff2 As Single
    Public RBuff3 As Integer

    Public Function Writememory(ByVal ProcessName As Process, ByVal Address As Integer, ByVal Value As Long, ByVal Bytes As Integer)
        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If
        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        WriteProcessMemory(processHandle, Address, Value, Bytes, Nothing)

        CloseHandle(processHandle)
        Return True
    End Function

    Public Function ReadFloat(ByVal ProcessName As Process, ByVal Address As Single)

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing)

        CloseHandle(processHandle)

        Return RBuff

    End Function

    Public Function WriteFloat(ByVal ProcessName As Process, ByVal Address As Integer, ByVal Value As Single)

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        WriteFloatMemory(processHandle, Address, Value, 4, Nothing)

        CloseHandle(processHandle)
        Return True
    End Function

    Public Function ReadLong(ByVal ProcessName As Process, ByVal Address As Integer)

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing)

        CloseHandle(processHandle)

        Return RBuff

    End Function

    Public Function ReadFloatPointer(ByVal ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short)

        Dim fullAddress As Long

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(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 ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short, ByVal Bytes As Integer)

        Dim fullAddress As Long

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(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 ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short, ByVal Value As Single)

        Dim fullAddress As Long

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)

        fullAddress = RBuff + Offset

        WriteFloatMemory(processHandle, fullAddress, Value, 4, Nothing)

        CloseHandle(processHandle)
        Return True
    End Function

    Public Function WriteLongPointer(ByVal ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short, ByVal Value As Long, ByVal Bytes As Integer)

        Dim fullAddress As Long

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        ReadProcessMemory(processHandle, Base, RBuff, 4, Nothing)

        fullAddress = RBuff + Offset

        WriteProcessMemory(processHandle, fullAddress, Value, Bytes, Nothing)

        CloseHandle(processHandle)
        Return True
    End Function

    Public Function NOP(ByVal ProcessName As Process, ByVal Address As Integer, ByVal value As Integer)

        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)

        If GameLookUp.Length = 0 Then

            End

        End If

        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)

        WriteProcessMemory(processHandle, Address, value, 1, Nothing)

        CloseHandle(processHandle)
        Return True
    End Function

End Module
Nun zum eigentlichen Code in Form1:
Was auch ganz sicher die Fehlerquelle sein wird.

Code:
Public Class Form1

    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        Try
            If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then
                Dim proc As Process = Process.GetProcessesByName("Sacred DarkBloods Extrem")(0)
                Dim base = &H6D3BC0
                Dim Offset1 As Short
                Dim Offset2 As Integer
                Dim Offset3 As Integer
                Dim Offset4 As Byte
                Dim Offset5 As Byte
                Dim Wert As Long
                Offset1 = ReadLong(proc, base)
                Offset2 = ReadLong(proc, Offset1 + &H10)
                Offset3 = ReadLong(proc, Offset2 + &H3AC)
                Offset4 = ReadLong(proc, Offset3 + &H3AC)
                Offset5 = ReadLong(proc, Offset4 + &H4)
                Wert = ReadLong(proc, Offset5 + &H4)
                TextBox1.Text = Wert
            End If
        Catch ex As Exception
            MsgBox("Bitte starte zuerst Sacred mit den Exenamen Sacred DarkBloods Extrem", MsgBoxStyle.Critical, "Process nicht gefunden!")
        End Try
    End Sub
End Class
Was ist da blos falsch? .... ":confused: :confused: verzweifel :confused: :confused:"
Wäre echt sehr dankbar für sehr gute Tipps und Hilfen was in der TextBox1 noch verbessert werden muss damit der Pointer auf die richtige Adresse auch wirklich zeigt und den identischen Wert wie bei Cheat Engine anzeigt. ;)

EDIT:
Tja das Thema hat sich erledigt bis dann.