[VB] Pointer auslesen (Nostale) Help

03/09/2011 20:00 bvz#1
Ich frag mal die Programmierer unter euch,die vll nen Plan haben wie ich das hinkrieg.
Folgendes Problem :

Ich will die Hp Adresse : 007B11A8 mit den beiden Offsets : 4C,AC in VB zum laufen kriegen.

Mein Modul(Memory) sieht so aus :

Code:
 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 ReadLongPointer(ByVal ProcessName As Process, ByVal Base As Integer, ByVal Offset As Short, ByVal Offset2 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 + Offset2

        ReadProcessMemory(processHandle, fullAddress, RBuff3, Bytes, Nothing)

        Return RBuff3

        CloseHandle(processHandle)

    End Function

So im Hauptprogramm bei Button 1:

Code:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim p As Process() = Process.GetProcessesByName("NostaleX.dat")
        If Not p.Length = 0 Then
            Label2.Text = Memory.ReadLongPointer(p(0), &H7B11A8, 76, 172, "4")  'Process "p" , Adresse , Offset ,Offset2, Byte
        Else
            MsgBox("Nostale ist nicht geöffnet!")
        End If
    End Sub
Hier habt ihr die neuste Hp Adresse aus Nostale De :




Hab mal versucht die Hex Zahlen in Dezimalzahlen zu schreiben scheint auch nicht zu funktionieren...
Manchmal bekomm ich ein Wert raus,der sich immer ändert und total falsch ist..
Hoffe jemand kann mir helfen :D
Ich habs nicht in den Code Bereich gepostet ,weils hier eh ein paar Experten gibt ;)
03/09/2011 21:41 P-a-i-n#2
Du mußt wenn alle als HEX-Angabe zusammenrechnen dann haste aber einen integer als Wert mußt du mit Convert zu Hex konvertieren fertig :)

Auf deutsch übergebe es an einen int32(das Ergebnis) und konvertiere den dann in einen String in HEX sonst haste ja kein A,B,C.. drin.
03/09/2011 22:20 bvz#3
Ich versuchs mal , hoffe ich schaff es :P
Wenn nicht wär ein Beispiel ganz nett ;P
03/09/2011 22:28 P-a-i-n#4
Da mußte deine Funktion ändern

Dim MeineAdresse As Int32 = &H7B11A8 + &H4C + &HAC ' = 8065696 als integer
Dim MeinPTR as String = Convert.ToString(MeineAdresse , 16) ' = 7b12a0 als HEX

Der aufruf in der Funktion ist dann Blabla("&H" & MeinPTR,..........etc)
03/10/2011 08:59 mydoom#5
Muss man in VB echt diese unnötige Umwandlung in einen String machen? Ich dachte eine Zahl ist eine Zahl, egal ob diese im hexadezimalen, dezimalem oder dualem System vorliegt : o
03/10/2011 12:26 bvz#6
Tut mir leid darin bin ich noch nicht so gut ...
Habs im Hauptprogramm geschrieben

Und meine Funktion so verändert 'Process "p" , Adresse(MeinPTR) , Byte

aber klappt immernoch nicht :s
03/10/2011 13:33 P-a-i-n#7
Hatte dir gesagt das deine Funktion, die ReadLongPointer nicht grade gut ist.
Aber ich hab es mal so vorbereitet und zeig dir das es geht das du mehrere Offsets garnicht brauchst hab ich noch nie genutzt.
Müßtest nur halt mit indexof die ModuleBase von dem Module holen wo der Pointer drin liegt.
Schau dir mal das Vid an es ist möglich mit VB nicht nur mit Zahlen auch mit ganzen Bytearrays ;)

03/10/2011 15:25 bvz#8
Langsam begreif ich wie du das meinst :D

Also hab jetzt die Funktion

Code:
 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
Button 1

Code:
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim p As Process() = Process.GetProcessesByName("NostaleX.dat")
        Dim MeineAdresse As Int32 = &H7B11A8 + &H4C + &HAC ' = 8065696 als integer
        Dim MeinPTR As String = Convert.ToString(MeineAdresse, 16) ' = 7b12a0 als HEX

        If Not p.Length = 0 Then
            Label2.Text = Memory.ReadLong(p(0), MeinPTR)
            'Label2.Text = Memory.ReadLongPointer(p(0), MeinPTR, 16)  'Process "p" , Adresse , Offset,Offset2, Byte
            ' Label2.Text = Memory.ReadLong(p(0), &H7717344)
        Else
            MsgBox("Nostale ist nicht geöffnet!")
        End If
    End Sub
End Class
Fehler : Ungültige Konvertierung von der Zeichenfolge 7b12a0 in Typ Integer.

Nur noch ein kleiner Fehler denk ich mal...eig hab ich doch angegeben das ich es als String ausgebe

Sry wenns Fragen über Fragen sind und danke,dass du dir soviel mühe mit dem Video gemacht hast -> Super nett

@edit ich probier weiter rum gleich hab ichs sicher :D
03/10/2011 15:47 P-a-i-n#9
Wenn du garnicht klarkommst warte einfach etwas ich stelle den Trainer dann hier rein ich mach noch paar Funktionen rein das man einiges machen kann und ein Video wie man mit Olly die Spieletweaks findet das ist für Anfänger geeignet.

Ob es heute abend wird weiß ich noch nicht aber ich stelle ihn hier rein ;) zumindest in die TuT-Bereich.
Mit WindowsHotkey hook die auf allen O/S funktionieren wirst du ja wenn dann sehen.
Werde ein Blanco reinstellen ohne Adressen und 1 mit Beispielen für CoD4 Singleplayer ;)
03/10/2011 15:54 bvz#10
Danke dir :D Man findet auch kein vernünftiges Tut im Inet deshalb wärs eh angebracht :P
03/10/2011 16:14 P-a-i-n#11
Die Funktionen davon sind sehr leicht man kann mit der normalen Funktionen sie so ändern das man Floats.Int,Bytes undauch das Bytearray also sprünge ändern kann.

Allerdings setzt es VB 2010 vorraus in 2008 hab ich es probiert geht nicht das Framework 4.0 ist wirklich super geeignet dafür für alle O/S.

Hab ich mir mehr oder weniger von Funktionen in C++ abgeschaut

Andere frage wenn du deine Adesse oben in HEX Konvertiert hast ist das ergebnis genau das selbe wie in CE ?
Wenn ja und nichts passiert solltest du Vsual Basic als Admin starten und vllt noch DebugPrivileg setzen.
Dazu muss das ins Formload
Process.EnterDebugMode()
03/10/2011 16:35 bvz#12
Es kommt ne lange zahl raus (121417616) ,die sich nicht verändert..
Ich arbeite eh mit Vb 10 ;)
03/10/2011 16:43 P-a-i-n#13
Darf eigentlich nicht sein aber wie gesagt Adresse + Offset + Offset = Bullshit , wieso
in CE ist das gut man hat ja jetzt die Adresse die totale Ardresse nur schauen in welchen Module das ganze geschoss liegt.

Siehst du ja wie ich es im Video gemacht habe man brauch keine Offsets X-Offsets nur 1.
Da könnte man auch zu sagen vom Startpunkt bis zum Zielpunkt = Offset
Also ModuleBase + Offset(der Zielpunkt) = die totale Adresse so gehe ich immer vor ist einfacher find ich.

Wie das mit den Multioffsets aussieht weiß ich noch nicht ich werd es mir mal anschauen es kann sein das man eine Zwischensumme bilden muss.

Aber ich werde dir noch ein Video jetzt schnell machen und lasse mir mal die Adressen in den Integern Anzeigen und drunter in HEX so wie sie sein sollen da siehst du mal die unterschiede.
Werd wieder CoD4 als Bsp nehmen da kann ich das Fenster so schön klein machen das man alles sieht. :)
03/10/2011 16:59 bvz#14
Okay gut bin mal gespannt ..immer diese dummen offsets ohne läufts ja :D

@edit habs endlich hinbekommen :) und wie du sagtest braucht man nichtmals die offsets eintragen :D
dankeeeeeeeeeeeeeeee
03/10/2011 17:16 P-a-i-n#15
Doch 1 Offset brauchst du ganz sicher denke mal du hast Win7 die adressen ändern sich es ist aber immer an einer andern selben Stelle bei wenigen Spielen ist es Statisch.
Aber ich mach trotzdem das Video da siehst du wo es bei dir klemmt ;).

Ich hab es grade mal nur mit integer versucht ja das geht auch ist aber komisch weil die Zahlen so groß sind also Konvertieren muss man es nicht ich mach es aber sonst muss ich ja alles umrechnen das gefällt mir nicht :D

Naja VB ist da eh etwas komisch drin