Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 08:03

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Cheatengine Pointer finden

Discussion on Cheatengine Pointer finden within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
ByteDevil's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 83
Received Thanks: 17
Cheatengine Pointer finden

Hallo Leute,

sicher runzeln bei dem Titel viele die Stirn und sagen "Bitte nicht noch so ein Thread" aber ich habe die "üblichen" Wege solch einen Basepointer zu finden schon durchgekaut. Falls es interessiert...es geht um das Halflife 1 Remake "Black Mesa" und ich versuche momentan einen funktionierenden Pointer auf zB. den Inhalt des Assault Rifle Magazins zu finden. Den bloßen Wert zu finden ist gar kein Problem...wenn ich einen Pointerscan durchführe, finde ich natürlich unglaublich viele Pointer...4 oder 5 rescans später mit mehreren neustarts des Spiels, ist die Liste leider leer... (bis Pointer Level 5 habe ich suchen lassen - ca 2 Milliarden mögliche Pointer findet man dann).

Wenn ich den Pointer auf die "gute alte Art" finden möchte (Find out what writes to this address), wird mir folgendes angezeigt:


5A4528E8 ist die Adresse die ich manuell gefunden habe und die gerade den Wert beinhaltet.

mov [eax],ecx ist ja der Code, der den neuen Wert setzt. Da ist schonmal kein Offset dabei...
Suche ich dann nach 5A4528E8, finde ich keine einzige Adresse die auf diese Adresse zeigt... und nun? Weiß nicht mehr weiter... Vielleicht komme ich mit einem noch tieferen Pointerscan weiter? Level 7 oder so? Dauert aber natürlich dann ewig...bestimmt 4 oder 5h und das obwohl mein PC alles andere als langsam ist und ich viele Pointer suchen muss.

Bei den HP und der Armor des Spielers bin ich mit dem Pointerscan erfolgreich gewesen.

Wäre sehr nett, wenn mir hier jemand helfen könnte

LG
ByteDevil
ByteDevil is offline  
Old 03/06/2017, 23:36   #2


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,104
Received Thanks: 681
Wie man sieht, wird der Speicher an besagter Adresse durch Dereferenzierung von EAX beschrieben. EAX wiederum, das kann man einer Instruktion vorher entnehmen, kommt aus [EBP + 10] (vermutlich ist 0x10 gemeint). EBP ist in der Regel der Frame Pointer (zeigt auf eine bestimmte Stelle im Stack) und [EBP + 0x10] enthält eines der Funktion übergebenen Argumente. An der Stelle würde ich hier ansetzen und schauen, von wo die Funktion aufgerufen wird (muss ebenfalls auf dem Stack stehen) und woher das Argument kommt, was hier verwertet wird.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 03/06/2017, 23:47   #3
 
ByteDevil's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 83
Received Thanks: 17
Hi Jeoni

Danke für deine Antwort

Ich habe die Adresse die hinter EBP+10 steht mal manuell hinzugefügt um zu sehen wo ich dann rauskomme. Der Inhalt springt aber ständig zwischen irgendwelchen random Werten hin und her :/ Ist das ein indikator dafür, dass es eine Sackgasse ist? Weiß nicht genau was ich sonst damit anfangen soll :/
ByteDevil is offline  
Old 03/06/2017, 23:54   #4


 
Jeoni's Avatar
 
elite*gold: 966
Join Date: Apr 2010
Posts: 1,104
Received Thanks: 681
Nein, es ist keine Sackgasse, nur der falsche Ansatz. Es handelt sich hierbei um eine lokale Variable. Sie liegt auf dem Stack und sobald die Funktion, zu welcher der Code, den du oben gepostet hast returnt, kann die lokale Variable jederzeit wieder überschrieben werden. Daher muss man hier auch manuell ran und sich den Code ansehen (genauer gesagt den spezifischen Caller von obig geposteten Code), um zu schauen, wie bzw. von wo der Pointer kommt, der da als Argument (auch eine Art von lokaler Variable) übergeben wird. Die Returnadresse, also die Adresse des Callers solltest du standardmäßig bei [EBP + 4] finden. Nur aufpassen, dass du den Wert auch im richtigen Kontext abrufst, denn auch das ist natürlich lokal.
Mit freundlichen Grüßen
Jeoni
Jeoni is offline  
Thanks
1 User
Old 03/07/2017, 00:02   #5
 
ByteDevil's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 83
Received Thanks: 17
Okay, leider hab ich tatsächlich nur die Hälfte von dem Verstanden was du sagst^^ Ich weiß was der Stack und was der Heap ist und auch was eine lokale Variable ist. Bei Caller bin ich raus^^

Falls du das in kurzen Worten erklären kannst/willst wäre ich dankbar, verstehe aber auch wenn das jetzt zu weit führt^^

Finde es sehr schade das man in irgendwelchen Tutorials nie auf solche Probleme trifft und man da sofort den Pointer auf die 0815-Weise findet -.-
ByteDevil is offline  
Old 03/07/2017, 03:07   #6
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,464
Der Stack behinhaltet lokale Variablen. Dazu zählen auch übergebene Funktionsparameter!

Wir haben Beispielsweise diesen Funktionsaufruf:
Code:
push    edi
push    eax
mov     ecx, edi
call    sub_1000DC20
Die PUSH-Instruktionen legen die Parameter auf dem Stack ab. (Wenn du ein solches Konstrukt mit dem mov ecx, ... siehst, kannst du davon ausgehen, dass die Funktion, die aufgerufen wird, zu einem Objekt gehört. Ist aber erstmal nur nebensächlich).

Beim CALL wird zusätzlich die Rücksprungadresse abgelegt. Sonst weiß das Programm am Ende der Funktion nicht, wo es hin soll.

TLDR; Diese Stelle ist der "Caller". Die Stelle, an der die Funktion aufgerufen wird.

Der Stack sieht mit Betreten des CALLs dann so aus:

Code:
0 Rücksprungadresse
+4 <Wert von EAX>
+8 <Wert von EDI>
Wenn die Funktion nun noch lokale Variablen hat, werden diese oberhalb der Rücksprungaddresse abgelegt (Allerdings nicht via PUSH. Dieser Bereich wird normalerweise einfach Stumpf vorreserviert).
Mit zwei Variablen sähe das dann so aus.
Code:
-8 Variable v2
-4 Variable v1
0 Rücksprungadresse
+4 <Wert von EAX>
+8 <Wert von EDI>
An dieser Stelle sollte dir aufgefallen sein, dass ich alles um die Rücksprungaddresse herum addressiert habe. Das hat auch einen Grund: Am Anfang einer "klassischen Funktion" wird das Register EBP an dieser Stelle "fixiert". d.h. Mit EBP+4 kommst du immer an den ersten Parameter, mit EBP-4 immer an die erste lokale Variable.

("klassischen Funktion" deshalb, weil man es nicht generalisieren kann. Der Compiler macht viele Optimierungen, daher trifft das nicht einfach grundsätzlich auf alle Funktionen zu)

Soweit so gut.

Code:
mov eax,[ebp+10]
Wir suchen EBP+10. Das Plus sagt uns, dass es sich um einen Parameter handeln sollte. Zusammen mit 0x10 ergibt das den vierten Parameter. (Eine Addresse hat auf einem 32 Bit System 4 Byte. 0x10 sind 4x 4 Byte).

TL;DR: Wir suchen den Parameter, der durch den Caller an die Funktion übergeben wird, der dann in EBP+10 verfügbar ist.
florian0 is offline  
Thanks
2 Users
Old 03/07/2017, 07:28   #7
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
wenn ein stackframe erstellt wird sieht das meist folgendermaßen aus:
Code:
push ebp
mov ebp, esp
d.h. an 0 liegt der vorherige ebp wert, nicht die rücksprungadresse...
dementsprechend liegt der erste parameter auch immer an +0x8 und nicht +0x4, usw...
Dr. Coxxy is offline  
Thanks
1 User
Old 03/07/2017, 07:47   #8
 
ByteDevil's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 83
Received Thanks: 17
Hallo und vielen, vielen Dank für die Antwort

Okay, also ich habe es mir erneut angesehen und bemerkt das bei

Code:
mov ecx,[eax+04]
mov eax,[ebp+10]
mov [eax],ecx
EBP an dieser Stelle immer 0019D218 ist. Also auch nach einem Neustart des Spiels/PC's.
Nun ist aber völlig egal ob ich bei 0019D218+10, 0019D218+8 oder 0019D218+4 nachsehe - der Wert darin springt immer wild hin und her.
Wärt ihr so nett mich noch ein wenig weiter in die richtige Richtung zu schupsen? Ich möchte wirklich nur lernen wie das funktioniert, weil ich reverse engineering unglaublich interessant finde.

Kann ich vielleicht irgendwie eine Art Breakpoint auf diesen Code setzen, der auslöst und mitschneidet was in den Registern steht, wenn ich meinen Wert im Spiel gerade mit dem oben genannten OP-Code verändere?

PS: Habe nochmal einen Screenshot gemacht der es etwas übersichtlicher Anzeigt:

ByteDevil is offline  
Old 03/07/2017, 14:10   #9
 
elite*gold: 100
Join Date: Apr 2008
Posts: 860
Received Thanks: 1,464
Quote:
Originally Posted by Dr. Coxxy View Post
d.h. an 0 liegt der vorherige ebp wert, nicht die rücksprungadresse...
dementsprechend liegt der erste parameter auch immer an +0x8 und nicht +0x4, usw...
Du hast vollkommen recht. Es war wohl schon etwas spät.


Die Addresse 0019D218 bezieht sich auf den Stack. Das erkennt man daran, dass sich der Inhalt konstant ändert, aber abundzu dein gewünschter Inhalt ist.
Es gibt nur einen Stack pro Thread. d.H. Alle Funktionen die sonst noch in diesem Thread aufgerufen werden, nutzen ebenfalls den selben Stack. Und das führt dann dazu, dass hier eben auch andere Daten abgelegt werden.


Deine Funktion ist folgende:
Code:
PUSH EBP
MOV EBP, ESP

MOV EAX, [EBP+08]
MOV ECX, [EAX+04]
MOV EAX, [EBP+10]
MOV [EAX], ECX

POP EBP
RETN
Wir suchen einen Pointer auf den Wert von EAX, richtig? EAX resultiert aus MOV EAX, [EBP+10]. Wir wissen, dass sich EBP auf den Stack bezieht, und wir wissen aus meinem vorherigen Post, dass es sich her um einen Parameter handeln sollte.

Wir müssen nun also rausfinden WO die Funktion aufgerufen wird (Caller finden).
Wie finden wir den? Easy. Wie wir ebenfalls bereits wissen, wird die Rücksprungaddresse (zum Caller) mit ausführen der CALL-Instruktion auf dem Stack abgelegt.

Den Stack sieht man, leicht eingequetscht, unten rechts in der Ecke. Dort sieht man:

Code:
0019D248
server.dll+XXX
21D10024
....
...
...
Wie Dr. Coxxy schon sagte und in dem Assemblycode von oben sichtbar:
Der oberste Wert im Stack resultiert aus dem "PUSH EBP". Da es keine weiteren PUSH-Instruktionen oder Schreiboperationen in das ESP-Register gab, hat sich der Stack auch nicht weiter verändert. Das heißt, der darauf folgende Eintrag im Stack, ist die Rücksprungaddresse.
Da war sich auch CheatEngine ziemlich sicher, schließlich hat es server.dll+xxxx hingeschrieben.

Und das ist der Ort, den du dir mal genauer ansehen solltest. Dort sollte genauer aufgelöst werden, wie der Pointer berechnet wird.

Gruß
florian0
florian0 is offline  
Thanks
1 User
Old 03/07/2017, 19:10   #10
 
ByteDevil's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 83
Received Thanks: 17
Ah, okay ich habe größtenteils verstanden was du sagst. Hier mal ein neuer Screenshot wo mehr vom Stack zu sehen ist:



4CE200D0 ist übrigens in diesem Fall gerade die Adresse zu der ich möchte und die meinen Wert beinhaltet.
Also ist nun 0EDB88B3 meine Rücksprungadresse der Funktion welcher ein Pointer auf meine Lebenspunkte/Munition etc. als Parameter übergeben werden?
Wenn ja, dann muss ich mir irgendwie sämtliche Parameter des Aufrufes anzeigen?
ByteDevil is offline  
Reply


Similar Threads Similar Threads
[Cheatengine] Funktionsaufruf finden
01/21/2016 - General Coding - 10 Replies
Hi, Da Ich mich mit Cheatengine kaum auskenne hier meine Frage: Ist es möglich, wenn Ich bspweise eine Anwendung gestartet habe und in dieser Anwendung einen Knopf drücke (als beispiel), dass dann in der cheatengine opcode Ansicht (also wo man die assembler anweisungen sieht) angezeigt wird WELCHER Code da jz aufgerufen wird ? Wenn ja wie macht man das?
Pointer von Cheatengine in C++
05/20/2015 - C/C++ - 7 Replies
Ich will einen Base Pointer den ich in Cheat Engine gefunden habe in eine Dll mithilfe von c++ einbauen. MIthilfe des Pointer Scanns habe ich einen Base Pointer mit der Adresse "Meingame.exe"+004CECBC 1. Offset :1c8 "Meingame.exe" = 00400000 egal was ich versuche es scheint nicht zu funktionieren hier ein Beispiel: DWORD dwItemBase = *(DWORD*)(0x00400000+0x004CECBC);
[CheatEngine] JDownloader Prozent Pointer finden
02/11/2014 - General Coding - 5 Replies
Hey EPVP ! Hab ne Frage ... Und zwar suche ich seit ca einer halben Stunde den Pointer für den gesamten Download fortschritt im JDownloader . Die Werte sind logischer Weise in Prozent angegeben. Ich habe versucht die Werte mit "Unknown initial value" zu finden und wenn es jedesmal ein stück weiter geladen hat es mit "increased value" abgefiltert. Diese Methode habe ich mit float und double versucht.
Pointer/Pointer finden (problem)
01/08/2014 - AutoIt - 7 Replies
Hallo Leute. Bin schon seid einigerzeit am suchen bzw. rumtesten wie ich "die Adresse der Koordinaten der hingeklickten Stelle" finden kann ... :S will ein bot erstellen und damit er im hintergrund aufen kann brauche ich: Meine character coordinaten/Pointer ( Habe ich) und jetzt muss ich die coordinaten der hingeklickten stelle finden bzw. die adresse aber iwie klappt nix x,x ... finde immer einige adressen und den pointer meines charas , der Pointer der coordinaten meines charas...



All times are GMT +1. The time now is 08:03.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.