Dynamischen Pointer -> Base/Static pointer

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Trust

Betreff: Dynamischen Pointer -> Base/Static pointer

BeitragMi, Aug 11, 2010 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Gemeinde,

ich habe folgendes anliegen:

Viele Speicheradressen werden zur Programmlaufzeit dynamisch reserviert und ändern sich nach neustart des Programms.
Um nun ein Programm schreiben zu können das immer exakt den selben Wert ändert oder ausliest ( zB. wie Trainer die Leben und Mana auslesen und verändern können uvm.) dürfte man nichtmehr mit der Adresse oder dem Pointer arbeiten, der direkt auf die Adresse die diesen Wert enthält zeigt, sondern müsste ganz an den "Anfang" - zum statischen Pointer/Adresse und die Offsets.
Zb.:

BasePointer -> dynPointer1 -> dynPointer2 -> Wert
BasePointer + Offset1 = dynPointer1 + Offset2 = dynPointer2 = Wert

Um nun immer zur Adresse zu gelangen die bei jedem neustart des Programms eine andere ist und zB. auf das Leben zeigt, müsste man beim Wert(Adresse) anfangen und bis hin zum BasePointer "zurückrechnen".
So wäre es möglich immer auf zB. den Wert des Leben zuzugreifen, auch wenn die Adresse nach jedem neustart des Programms/Spiels eine andere ist.

BasePointer + Offset1 + Offset2 = Wert

Da dies mit BB so gut wie unmöglich ist (oder extrem aufwändig mit dlls usw.) und ich mich mit Assamblern nicht auskenne wollte ich mal nachfragen ob jemand ein kleines, feines Tool kennt, das eben von der dynamischen Adresse bis hin zum BasePointer rechnet und dir die Adresse plus Offsets ausgiebt.
Gerne auch C/C++ Quellcode der halbwegs vernünftig dokumentiert ist ( würde gern daraus lernen wollen).

Vieleicht hat auch jemand mal erfahrungen mit diesem Thema gesammelt und kann diese hier mit mir/anderen Teilen.

Schonmal Vielen Dank

Trust

Thunder

BeitragDo, Aug 12, 2010 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Was verstehst du unter dem Base Pointer? Ich verstehe darunter die individuelle Basis eines Stackrahmens, daher kann ich deinen Erklärungen nicht ganz folgen.

2. dynamischer Pointer habe ich noch nie gehört Very Happy

3. Windows hat einige Debugfunktionen in der WinAPI implementiert. Ich habe ein kleines Tutorial gefunden das zeigt, wie man die anwendet.
Es ist aber Assembler. Assemblerkentnisse schaden bei Lowlevel-Programmierung nicht.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Arrangemonk

BeitragDo, Aug 12, 2010 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
er will einfach die basisadresse von arrays haben(was normalerweise die adresse des ersten elements ist) und der offset ist die länge des datentyps * index des arrays, bei mehrdimensionalen arrays, nochn bischen komplizierter, aber generell total nutzlos
die frage is nur wieso 0_o
ingeneur

Trust

BeitragFr, Aug 13, 2010 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten.

@Thunder

Das Tutorial bringt mir leider nicht sehr viel denn wie man da effectiv an die gewünschten Speicheradressen kommt wird garnicht erklärt:

Zitat:
Wir können sehr leicht an die Speicheradressen wie z.B. Mineralien ran kommen indem wir einen Debugger
verwenden. Dazu würde ich Olly Debug empfehlen.

Und mehr erwähnt er diesbezüglich leider nicht.

Zitat:
2. dynamischer Pointer habe ich noch nie gehört

Naja die sind ja sowieso von Grund aus dynamisch. Dafür sind sie ja auch gedacht Smile


@ Arrangemonk

Sind denn die Basisadressen von arrays immer gleich?
Auch nach jedem neustart des Spieles/Programms...?
  • Zuletzt bearbeitet von Trust am Fr, Aug 13, 2010 1:04, insgesamt einmal bearbeitet

maximilian

BeitragFr, Aug 13, 2010 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrangemonk hat Folgendes geschrieben:
er will einfach die basisadresse von arrays haben(was normalerweise die adresse des ersten elements ist) und der offset ist die länge des datentyps * index des arrays, bei mehrdimensionalen arrays, nochn bischen komplizierter, aber generell total nutzlos
die frage is nur wieso 0_o


Damit ist genauso wenig klar was er eigentlich will. Dein Beitrag erklärt im Grunde garnichts.
Variety is the spice of life. One day ignore people, next day annoy them.

Trust

BeitragFr, Aug 13, 2010 1:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,

ganz simpel an einem Bs. erklärt:

ich habe in meinem Spiel(welches auch immer, muss nichtmal ein Spiel sein) einen bestimmten Wert, nehmen wir einfach mal das Leben der Spielfigur.

Jetzt gehe ich her und suche mir mit einem Programm meiner Wahl die Speicheradresse raus in der der Wert des Lebens gespeichert ist.

Mein Problem ist jetzt aber folgendes ->

Diese Speicheradresse wurde dynamisch zur Laufzeit des Spieles reserviert,
folglich wird diese beim nächsten starten des Spieles eine andere sein.
Was bedeutet das mir die dynamisch reservierte Speicheradresse nix bringt.

Alle dynamisch, zur Laufzeit reservierten Speicheradressen haben ihre Basis adressen, und anhand dieser und der Offsets kann man auf die dynamisch reservierte Speicheradresse schließen.

Aber bevor dies möglich ist muss man erstmal von der dynamisch reservierten Speicheradresse auf die Basisadresse und die Offsets kommen...

Und das ist meine eigentliche Frage...
Wie stelle ich das am besten an?

Vielen Dank
Trust

Der Eisvogel

BeitragFr, Aug 13, 2010 9:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich nehme für sowas die CheatEngine
Damit kannste alles derart machen. Ich habe da mit dem mitgelieferten interaktiven Tut angefangen und kann jetzt alles was ich brauch, und was man für deine Zwecke benötigt. Also wenn du bei der CheatEngine hilfe brauchst, dann kannst du mich gerne anschreiben

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragFr, Aug 13, 2010 10:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Die addresse der eigentlichen Daten ändert sich, die addresse des pointers, der auf diese Daten zeigt, ändert sich nicht, da er eine statische variable ist. Deshalb muss man, damit das ganze nach nem neustart des Programms noch funktioniert, die Addresse des Pointers verwenden, und sich von dort zu den Daten hangeln.

Trust

BeitragFr, Aug 13, 2010 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Der Eisviogel

Ja CheatEngine ist mir ein Begriff.
Ich habe CheatEngine für sowas auch des öffteren benutzt.

Nur würde ich eben gern ein Programm schreiben, dass selber auf die Adressen "kommt".


@ BtbN

Ja das ist genau das was ich meine, nur wie kommt man von der Adresse die die Daten enthält, zur Addresse des Pointers die auf die Addresse zeigt die die Daten enthält und umgekehrt?

Theoretisch müsste man, wenn man die Adresse hat die den Wert enthält, den gesammten Speicherbereich den das Spiel benutzt, auf einen Wert(unsigned int) gleich der Addresse durchsuchen.

Allerdings ist es nicht immer ein Pointer mit einer statischen Adresse, der auf die Adresse, die den Wert enhält, zeigt.
  • Zuletzt bearbeitet von Trust am Fr, Aug 13, 2010 17:01, insgesamt 5-mal bearbeitet

Der Eisvogel

BeitragFr, Aug 13, 2010 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das was du willst ist meiner Meinung nach nahezu unmöglich, da es oft mehrere in Frage kommende Adressen gibt. Diese richtig auszuwerten ist extrem schwer. Du müsstest dir dazu ein Debugger für das jeweilige Programm schreiben, der jede Zeile des Programmcodes "überwacht". Wenn du sehen willst wie kompliziert das ist, dann schau dir den Source von der CheatEngine an.

Wenn du allerdings schon eine Adressstruktur hast, dann kannst du einfach zurück rechnen und im Normal-Fall kommst du dann sehr einfach zu der gesuchten Adresse. Allerdings musst du auch hier bei Bedarf die richtige Adresse erkennen. Allerdings ist das von Programm zu Programm unterschiedlich.
Ich selber hab mich auch schon an soetwas versucht, aber bisher habe ich nur eine vorhandene Adressstruktur entschlüsseln können.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragFr, Aug 13, 2010 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss über mehrere Starts hinweg den richtigen datenbereich finden, und dann den kompletten speicherbereich nach seiner addresse durchsuchen, und die alten Ergebnisse damit filtern. Das macht man so lange, bis man nurnoch eine addresse übrig hat.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group