[GW.exe]Pointer/Value_Problem

06/04/2008 18:55 wadimwadim#1
Hallo,
ich habe ein großes Problem. Und zwar geht es um Adressen aus der GW.exe .
Ich möchte Feste Speicheradressen aus Guild Wars rauslesen können. Die meisten adressen die ich finde, verändern sich nach jedem Neustart von GW oder beim verlassen eines Gebietes. Andere, die teils fest sind, ändern sich nach jedem update von GW.
Nun die eigentliche frage. Wie ist es möglich bei diese adressen, die sich andauernd ändern, den richtigen Pointer zu finden, auf den diese adressen alle zeigen?!?
Ich habe schon diverse tuts gelesen und alles mögliche ausprobiert. Aber ich komm einfach nicht weiter. Vielleicht kennt sich einer von euch ja hier mit diesem thema gut aus und kann mir weiterhelfen.


MfG

wadimwadim
06/04/2008 18:58 Azunai#2
achja das problem betrifft uns beide ^^
was wir bisher versucht haben,
via breakpoint haben wir diese infos bekommen,
mov[esi+0x10],edi
also haben wir esi bei einer unserer adressen ausgerechnet -.- und wollten dann einfach den pointer finden der esi definiert, daher haben wir nach dem ausgerechneten wert gesucht,
soweit so gut, 8000 oder 0 treffer -.-
06/05/2008 10:09 Bot_interesierter#3
Hi schaut mal ob der Wert des esi registers sich ändert wärend der laufzeit, wenn ja dann wird dieses Code stück benutzt um verschiedene Werte zu schreiben.
Ihr könnt auch einfach mal nach Adressen von euren Werten suchen, also wenn ihr zb HP an 0x18F808 habt dann sucht ihr im Speicher nach einer Stelle die den Wert der Adresse speichert, wenn ihr was findet habt ihr schonmal einen Pointer auf eure Adresse, dann müsst ihr nur schauen ob dieser Statisch ist.
Ausserdem kann man davon ausgehen das bestimmte Werte immer den gleichen relativen Abstand von einander haben, vorallem Werte die mit dem Char zu tun haben werden normalerweise gemeinsam alloct.

Von Guild Wars weiss ich jetzt nichts spezielles, aber vermutlich sind die Objecte in einer Linked List organisiert, dh jedes Object hat einen Pointer auf das nächste Object und je nach Art der Liste auch eines auf das vorhergehende, solche Linked Lists werden verwendet um Objecte im Speicher Dynamisch zu verwalten und möglichst Platzsparend unter zu bringen und vorallem damit man nicht auf jedes Object einen Pointer braucht.
06/05/2008 14:39 wadimwadim#4
Danke für deine schnelle Antwort.

Quote:
Ihr könnt auch einfach mal nach Adressen von euren Werten suchen, also wenn ihr zb HP an 0x18F808 habt dann sucht ihr im Speicher nach einer Stelle die den Wert der Adresse speichert, wenn ihr was findet habt ihr schonmal einen Pointer auf eure Adresse, dann müsst ihr nur schauen ob dieser Statisch ist.
Da finden wir nichts!
06/05/2008 23:52 Adroxxx#5
Hab vor langer Zeit auch mal gesucht. Sind sehr wertvolle Informationen, wenn man mal einen richtigen Bot programmieren will.

Da ich jetzt wieder Zeit hab, werd ich mich mal die Tage da dran setzen. Mal schauen :)
06/06/2008 17:06 Bot_interesierter#6
Das mit den HP war nur ein Beispiel, ziemlich sicher Zeigt da kein Zeiger hin, wahrscheinlicher ist es das es einen Zeiger auf den Anfang des Spieler Objektes gibt, oder auf dessen GUID (das ist eine Einzigartige Identifikationsnummer(64bit int)).
Und wenn man dann nach einem Zeiger sucht, muss man natürlich auch nach dem richtigen Daten Typ suchen, eine Speicher Adresse wird als unsinged integer gespeichert, wenn eurer Memory Editor Tool eine Hexstring suche unterstüzt, dann solltet ihr diese nutzen, das ist einfacher als die Hex Adresse in Decimal zu convertieren und dann nach diesem Wert zu suchen.
06/06/2008 17:08 wadimwadim#7
geht nicht... habe schon alles mögliche probiert
06/06/2008 18:19 Azunai#8
das war jetzt nicht auf des hex bezogen ;)
T-search/Cheat-engine/ollydbg haben alle hex search
das haupt problem ist halt das sich die adressen bei jedem mapwechsel ändern -.- und wir leider nicht den pointer finden der uns sagt wo die adresse sich nun nach dem laden befindet
06/09/2008 18:13 wadimwadim#9
Helft uns bitte
06/09/2008 18:43 syntex#10
Wenn der Pointer stimmt sollte es auch bei Map wechsel klappen.

Zu Pointern , die einfachste Methode ist natürlich es mit CheatEngine zu machen (Undetected Cheat Engine), dazu sucht ihr die Addresse und guckt wohin die Addresse schreibt ( what writes this address to ) , dort werdet ihr ein ASM snippet (merkt euch diesen , am besten aufschreiben) sehen und in Rot your Address is probaly (HEXADDRESS) , die sucht ihr dann als Hex im kompletten speicher.
Wenn ihr das habt , müsst ihr alle gefunden Addressen mit dem Offset Multiplizieren, das Offset ergibt sich aus dem ASM Snippet ... das was in den klammern steht hab gerade kein beispiel zur hand.

Ihr könntet auch mit OllyDBG dran , nur ist das schwerer, vllt das RAW Offset der Addresse finden und mit IDA Pro suchen, kann auch klappen.
06/09/2008 20:06 Adroxxx#11
Mit welcher Adresse habt ihr den konkret Probleme?

Die Adresse für's Inventar ist zB fest.
Gw.exe+61375C
00A1375C

Und 1 für's offene Inventar und 0 für's geschlossene.
06/09/2008 20:32 Term!nX#12
Wie hast du die Adresse fürs Inventar herausgefunden?
06/09/2008 21:28 wadimwadim#13
Adroxxx
Die Adresse rauszufinden ist ja kein problem, wir hatten schon mehrer gefunden. (Inventar hatte ich auch schon). Ist aber nicht wirklich das Inventar deine Adresse, sonder für [L](Quests) und [I].
Du sagst ja, dass diese Adresse fest ist. Ok, schön und gut... Haben mehrere feste Adressen, die sich nach einem Neustart von GW.exe nicht ändern. Nur nach einem Update von Guild Wars (z.B. BalanceUpdate) verändern sich die Werte wieder.
Unser Problem besteht darin, dass sie sich nach einem solchen Update ändern und wir sie noch einmal suchen müssen.
Unser anderes Problem ist, dass das z.B. Leben auf keine eindeutige Adresse weist. (Haben schon alles mögliche ausprobiert. Entwickler von G15 GW Applets gefragt, usw. ...)
Das was Syntex gesagt hat, haben wir mehrere Male probiert. Es gibt keine eindeutige Adresse!. Ich denke, dass sie immer aus irgendeiner anderen Adresse berechnet wird. (KA welche)


Quote:
Wie hast du die Adresse fürs Inventar herausgefunden?
Geht relativ einfach mit CE, einfach mal nach 4bytes typen suchen also (offen=1, zu =0) Paar mal suchen und da sind dann nicht mehr viele Adressen.
06/09/2008 22:26 Adroxxx#14
Gut, also mit bei dem Problem mit den Updates kannst du nichts machen. Das ist einfach so.
Deswegen funktionieren viele Bots & Hacks ( mein jetzt nicht die AutoIt sachen) nach einem Spieleupdate nicht mehr.

Wobei die einfache Suche nach den Adressen ist dann nur nebensache. Wenn man so einen fertigen Bot hat muss man nur die Adressen ändern.

Aber das Problem mit dem Leben kann ich jetzt nachvoll ziehen. Habe zwar die Adresse die wohl kein Pointer ist, aber die sich immer nach Gebietwechsel & restart des Games ändert.

Ich werd mal bissl mehr disassemblen und mal schauen was dabei rauskommt.

btw: Ein Pointer kann auch auf einen anderen Pointer zeigen. Pointer to Pointer. Dann musst du aus den einzelnen Pointern die Adresse berechnen. Ich glaub das ist die vorletze Übung beim CheatEngine Tutorial.
06/10/2008 18:13 Adroxxx#15
So hab mich mal ne längere Zeit drangesetzt und komm trotzdem nicht weiter :P
Also bei den HP als Beispiel finde ich 2 Adressen, die eine beinhaltet die Max-HP, wird wohl zur Berechnung vom Sterbemalus etc gebraucht und einmal die Aktuellen HP.

Hab mal im Olly einen BP drauf gesetzt, was aber nicht sehr viel geholfen hat. Ich habe dann zwar eine Adresse ausrechnen können nur nicht mehr testen, weil sich die Adresse der HP im laufenden Spiel geändert hat.
In CE waren die Adressen die das Leben beinhaltet hatten plötzlich leer.

Also die Adressen sind nicht über Pointer gemacht. Es findet eine berechnung statt. Ich werd später nochmal etwas probieren. Kann sein das die Adresse inerhalb einer DLL region ausgerechnet wird, dann bräuchte man die DLL Base Adress und könnte damit das offset ausrechnen, was man zur bestimmung der adresse braucht.

Aber ist keine leichte arbeit... die Programmierer von GW haben es uns nicht leicht gemacht ^^,