Ich hab ne Frage: ich versuche zum testen in Solitär ein Trainer zu basteln,
ich habe mir da den Basepointer rausgesucht und versucht den so zu benutzen, hier ein Beispiel:
PHP Code:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim p As Process() = Process.GetProcessesByName("Solitaire")
If Not p.Length = 0 Then
Memory.Writememory(p(0), &HFFD0AFA8 + &HE + &H32, CInt(TextBox1.Text), 4)
Else
dabei scheisst mir aber Solitär ab..... (Mag mich nicht:face palm
Hier habe ich unten die Adresse (FFD0AFA8) ist der Basepointer
und dazu habe ich noch die 2 Offsets... 14 und 50
was mache ich falsch? Weis hier einer eine Lösung zu meinem Problem?
So funktioniert das nicht mit Pointern, dass solltest du dir nochmal durchlesen. kannst du ja auch für VB übersetzen.
Was du machen musst:
&HFFD0AFA8 auslesen, &H32 addieren und den Wert dann auslesen und &HE addieren, dies dann erneut auslesen sprich:
So funktioniert das nicht mit Pointern, dass solltest du dir nochmal durchlesen. kannst du ja auch für VB übersetzen.
Was du machen musst:
&HFFD0AFA8 auslesen, &H32 addieren und den Wert dann auslesen und &HE addieren, dies dann erneut auslesen sprich:
Also wen ich dies nun richtig verstehe, kann ich es so machen:
BaseAdresse = ReadMemory(ReadMemory(ReadMemory(&HFFD0AFA8,4)+&H3 2,4)+&HE,4)
Und nun sollte ich auf die BaseAdresse schreiben können?
Ich verstehe c++ leider nicht so wirklich 😁😁
Nochmals danke fürs schreiben.
Mfg
Das war ein Pseudo-Code Beispiel die API-Funktion heißt ReadProcessMemory und hat mehr Parameter.
Ich wollte dir zeigen, wie Pointer ausgelesen werden.
Zeig mir mal deine MemoryRead Funktion von der Klasse die du verwendest ( also Parameter usw. ) dann kann ich dir das Schreiben.
Jedenfalls ist das so:
Du liest die Base Adresse aus und addierst das erste Offset hinzu, danach liest du das Ergebnis davon wieder aus ( neue Adresse ) und fügst dort das zweite Offset hinzu und davon liest du auch das Ergebnis aus und dann hast du deine Dynamische Adresse. Danach kannst du deine WriteMemory Funktion aufrufen und die Adresse verwenden.
Ganz nebenbei:
Die Offsets in CE sind bereits hexadezimal.
Der letzte Schritt ist übrigens zu viel. 14 ist bereits das letzte Offset und das Ergebnis ist die Zieladresse. Wenn du an der liest, erhälst du keine weitere Adresse, sondern den dortigen Wert (Punkte oder was auch immer du ändern willst).
Oh stimmt sorry, arbeite nicht alt zu viel mit Pointern bzw. ist es lange her das ich welche verwendet habe.
@.Scare™:
gerne, falls du noch Fragen hast kannst du dich auch per PN melden, ich kann versuchen zu helfen ( kann aber kein VB könnte dich höchstens in die richtige Richtung leiten )
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)
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)
Dim iPointer As Integer = ReadLong(Prozess, ReadLong(Prozess, &HFFD0AFA8)+&H32)) + &HE
und dann halt
Code:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim p As Process() = Process.GetProcessesByName("Solitaire")
If Not p.Length = 0 Then
Dim iPointer As Integer = ReadLong(p(0), ReadLong(p(0), &HFFD0AFA8)+&H32)) + &HE
Memory.Writememory(p(0), iPointer, CInt(TextBox1.Text), 4)
Else
Hallo Ten$ion, Danke für deine Guten Ratschläge, so wie du es geschriben hast, geht es nun prima.
NUR habe ich das gefühl das ich nun etwas falsch mache mit den Pointern. wen ich das Spiel neu starte, geht die Adresse nicht mehr, obwohl ich ja eine Grüne hatte... kann das sein?
mfg
Hier mein Bild von CE & meinem Code
So geht es.. wen ich das spiel neu starte geht es nimma. Liegt das irgentwie an dem "Grünen" Pointer?