Spiele-Trainer/Injector (Speicher-Manipulator) [Ungelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Spiele-Trainer/Injector (Speicher-Manipulator) [Ungelöst]

Beitrag von Coder Pinhead »

Hallo,

Nach langer Zeit der Abstinenz wollte ich mich mal wieder mit PureBasic befassen und frisch mit was neuem was mich Grad Interessiert einsteigen. Somit wollte mal fragen ob mir jemand ein paar gute Beispielcodes zukommen lassen kann. Ich hab auch schon das Deutsche, Englische, Französische PureBasic Forum und sogar Google durchsucht nur finde nicht ausreichend Stoff. Bei den meisten Beispielcodes zu dem Thema geht es um Minesweeper von Windows XP das ist zwar schön und gut als Beispiel aber nicht zeitgemäß da das Spiel Statische Adressen verwendet und die meisten Spiele Dynamische Adressen nutzen.

Danke schon mal im voraus für die Hilfe :).

Passenden Werten für ein mögliches Beispiel von Plants vs. Zombies v1.2.0.1073:
Bild: REMOVED
Pointer: 00189190 + 21880
Adresse: Dynamisch
Zuletzt geändert von Coder Pinhead am 01.10.2014 17:08, insgesamt 2-mal geändert.
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Thorium »

Such mal nach S2HackIt.
Der Code vom MemPatcher Plugin enthält Prozeduren zum lesen/schreiben mittels Pointern und auch zum lesen/schreiben von Variablen in DLL's, welche dem sogenannten shifting unterliegen. (sind relativ zur module base der DLL)
Für einige Spiele wirst du mehr als ein pointer offset brauchen und S2HackIt unterstützt nur ein Offset aber du kannst es als Beispiel benutzen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Coder Pinhead »

Danke erst mal für dein Beispielcode ist leider noch etwas zu Komplex für mich da ich etwas eingerostet bin. Aber wenn ich dein Code vom MemPatcher Plugin richtig verstehe bearbeitest du die Pointer über die Prozedur PatchPtr und schreibst den Wert mittels PokeB in den Speicher. Wie würde den das ganze ablaufen wenn ich den Wert über die Windows API mittels WriteProcessMemory_ beschreiben möchte oder geht das indem falle nicht?
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Thorium »

Coder Pinhead hat geschrieben:Aber wenn ich dein Code vom MemPatcher Plugin richtig verstehe bearbeitest du die Pointer über die Prozedur PatchPtr und schreibst den Wert mittels PokeB in den Speicher. Wie würde den das ganze ablaufen wenn ich den Wert über die Windows API mittels WriteProcessMemory_ beschreiben möchte oder geht das indem falle nicht?
Im Prinzip funktioniert das gleich. Du musst nur Peek durch ReadProcessMemory und Poke durch WriteProcessMemory ersetzen.

Der Unterschied ist das bei meiner Variante eine DLL in den Zielprozess injiziert wird und dann dort läuft, also direkten Zugriff auf den Prozessspeicher hat.

ReadProcessMemory und WriteProcessMemory sind nötig, wenn du von einem anderen Prozess aus den Speicher des Zielprozesses manipulieren möchtest. Die Adressen bleiben aber die gleichen.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Coder Pinhead »

Krieg es nur mit Statischen Adressen hin nicht mit Dynamischen Adressen :( :coderselixir:.
Kurzer Ablauf wie ich den jeweiligen Wert bearbeiten würde vielleicht kann mir ja dann jemand Helfen.

Code: Alles auswählen

...
hProcess      = OpenProcess_(#PROCESS_ALL_ACCESS,0,dwProcessId)   ;Öffnet den Prozess
lpBaseAddress = $401000                                           ;Statische Adresse
lpBuffer      = 1337                                              ;Neuer Wert
WriteProcessMemory_(hProcess, lpBaseAddress, @lpBuffer, 1000, 0)  ;Schreibt den neue Wert in den Speicher
...
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Thorium »

Für dynamische Adressen musst du den Pointer finden, z.B. mit Cheat Engine und diesen nicht überschreiben, sondern mit ReadProcessMemory auslesen, auf diesen ausgelesenen Wert ein Offset addieren (ebenfalls mit Cheat Engine finden) und an der resultierenden Adresse mittels WriteProcessMemory die Variable überschreiben.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Coder Pinhead »

Krieg es einfach nicht hin! Wenn ich den Pointer über ReadProcessMemory_ auslese und den Offset dazu addiere bekomme ich über die Debug Ausgabe immer 0 oder 1 raus. Kannst du oder irgendwer hier im Forum mir nicht ein funktionierendes Beispiel schreiben oder zumindest den Part mit dem Auslesen des Wertes. Krieg nämlich so langsam die Krise und Zweifel daran dass das mit Purebasic funktioniert da ich den Wert mit einem Beispiel Source unter C++ auslesen und verändern kann. Wollte nur nicht extra C++ Lernen um damit Trainer schreiben zu können.
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Bisonte »

Um Werte aus einem Spiel zu extrahieren um sie auf dem Display einer G15 anzuzeigen musste ich das so machen...

Code: Alles auswählen

 ...
hProcess      = OpenProcess_(#PROCESS_ALL_ACCESS,0,dwProcessId)   ;Öffnet den Prozess

BaseAdress  = $189190 ; Hier ist der Pointer
OffsetSonne = $21880  ; Hier ist der WErt der zum Pointer addiert wird um zum Wert zu kommen
NeuerWert   = 1000

ReadProcessMemory_(hProcess, BaseAdress, @BasePointer, 4, 0)
WriteProcessMemory_(hProcess, BasePointer + OffsetSonne, @NeuerWert, 1000, 0)  ;Schreibt den neue Wert in den Speicher
... 
Man benötigt dafür allerdings eine Pointeradresse die sich nicht ändert (Ist noch nicht der Wert den man ändern will)
und einen OffSet, was dann zu der Adresse addiert wird.
Dann liest man mit ReadPro.... die Speicherstelle aus, addiert den Offset und kann dann den Wert auslesen/ändern.
So funktionierte es bei z.B. SilkRoad/RoM. Das ändern war hierbei nicht erforderlich, da es nur eine Anzeige war, aber zum auslesen klappte es.

PS:Ich hoffe die adressen die oben standen waren Hexwerte und keine Dezimalwerte... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Thorium »

Wenn du mehr Trainer schreiben möchtest, solltest du dich lieber ein wenig mit Assembler auseinandersetzen. Die meisten Trainer überschreiben keine Variablen, sondern ändern den Code, der auf die Variablen zugreift. Damit spart man sich dann auch das ganze Pointer gesuche. Cheat Engine hat nen Debugger dabei, der dir die Codestellen auflistet, welche auf die Speicheradresse zugreifen. Dort musst du dann, in der Regel, nur ein oder zwei Instruktionen abändern. Oft reicht es aus die betreffenden Instruktionen durch NOP Instruktionen zu ersetzen. NOP = No Operation = tue nichts.

Bei Plants vs. Zombies könntest damit z.B. erreichen das keine Sonnenenergie abgezogen wird, wenn du Pflanzen baust oder das du nicht verlierst wenn ein Zombie ins Haus läuft, etc. Einfach die entsprechende Abfrage/Rechnung im Assemblercode abändern.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: Spiele-Trainer/Injector (Speicher-Manipulator)

Beitrag von Coder Pinhead »

Bisonte hat geschrieben:PS:Ich hoffe die Adressen die oben standen waren Hexwerte und keine Dezimalwerte
Sind Hexwerte.
Thorium hat geschrieben:Wenn du mehr Trainer schreiben möchtest, solltest du dich lieber ein wenig mit Assembler auseinandersetzen.
Wäre schon froh wenn ich einen Klassischen Trainer der mit Dynamischen Adressen zu recht kommt zum laufen krieg. Kannst mich aber gern auf ein paar Beispiele zum Thema Assembler mit Purebasic explizit zum Thema Trainer bau verweisen je mehr Input desto besser :mrgreen:.
Thorium hat geschrieben:Cheat Engine hat nen Debugger dabei, der dir die Codestellen auflistet, welche auf die Speicheradresse zugreifen.
Ich weiß nur leider ist Cheat Engine bekannt so das sich damit nicht alles Hacken lässt es sei man kann Delphi/Lazarus um sich ein "Undetectable" Cheat Engine anhand des Source Codes kompilieren zu können. Deswegen bevorzuge ich da ein anderen Memory Scanner und einen Externen Debugger/Disassembler :mrgreen:.

Na ja. wie dem auch sei krieg den Trainer trotzdem nicht hin :(.

Kompletter Test Source:

Code: Alles auswählen

Global PlantsVsZombiesTest

Procedure HackTheSun(*HackTheSun)
  Repeat
    Sleep_(0)
    If PlantsVsZombiesTest = 1
      hWnd = FindWindow_("MainWindow", "Plants vs. Zombies") ;Finde das Fenster Plants vs. Zombies
      GetWindowThreadProcessId_(hWnd, @PID) ;Ermittel den Process Identifier des Fensters Plants vs. Zombies
      hProcess = OpenProcess_(#PROCESS_ALL_ACCESS,0,PID) ;Öffnet den Prozess Plants vs. Zombies anhand des Process Identifier 
      BaseAddress = $189190 ;Die BaseAdress der Sonne
      OffsetSun = $21880  ;Der Offset der Sonne
      NewValue = 1337    ;Der neue Wert
      ReadProcessMemory_(hProcess, BaseAddress, @BasePointer, 4, 0) ;Liest die BaseAddresse aus und übergiebt ihn an den BasePointer
      WriteProcessMemory_(hProcess, BasePointer + OffsetSun, @NewValue, 4, 0) ;Addire den BasePointer mit OffsetSonne und Überschreibe den alten Wert im Speicher durch den neuen   
    EndIf
  ForEver
EndProcedure


If OpenWindow(0, 0, 0, 100, 70, "DMA Test Trainer", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(0, 10, 10, 155, 50, "PRESS TO HACK")
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 0
          If PlantsVsZombiesTest = 0
            SetGadgetText(0, "HACK IS ON")
            CreateThread(@HackTheSun(),0)
            PlantsVsZombiesTest = 1
          Else
            PlantsVsZombiesTest = 0
            SetGadgetText(0, "HACK IS OFF")
          EndIf
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Antworten