Home of Gamehacking - Archiv
Adressen-Probleme... - Druckversion

+- Home of Gamehacking - Archiv (http://archiv-homeofgamehacking.de)
+-- Forum: Gamehacking (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=3)
+--- Forum: Gamehacking (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=6)
+--- Thema: Adressen-Probleme... (/showthread.php?tid=913)

Seiten: 1 2 3


RE: Adressen-Probleme... - FPS-Player - 17.07.2012

Moin. Smiling

So, nach langer Zeit wollte ich mich mal wieder an CE versuchen und hab mit "Just Cause 2" einen geeigneten Kandidaten ausgesucht - mit dem Ergebnis, welches ich schon oben beschrieben habe - das Spiel stürzt ab, sobal ich "what writes/accesses to this adress" anklicke.

Da ich nun die Schnauze von CE voll habe, habe ich mich dem Programm "ArtMoney" zugewandt. Im Prinzip ist es (wenn man schon CE "kennt") selbsterklärend. Ich habe meine Adresse(n) im Alleingang gefunden (*stolz ist!*) und will nun nach dem Pointer suchen.

Das Gute: das Spiel stürzt nicht ab! Happy

Das weniger Gute: ich habe mich versucht, an diese Anleitung hier zu halten, komme aber leider mit der Erklärung dort nicht richtig zurecht. Ich bin soweit gekommen, das ich "pointer to beginning of memory block" anklicke... Ok. Im Programm steht, ich soll nun so lange Filtern, bis ich meine gesuchte Adresse habe. Wenn ich nun aber im Spiel den Wert ändere und ich dann auf "Filtern" gehe, weiß ich schon nicht mehr, was ich nun eintragen muß, denn dort steht "Benutzerdefiniert" und "Pointer-Wert", usw. - und diese Werte kenne/weiß ich ja nicht.

In der Anleitung steht, man soll vor dem erneuten Filtern das Spiel beenden, neu starten und wieder zu seinem Ausgangspunkt (also zu der gefundenen Adresse) zurückkehren, was aber ja nicht geht, da sie sich ja bei Neustart verändert...Pointer halt... :s

So, und nun hoffe ich, das sich einer von euch auch mit ArtMoney auskennt und mir helfen kann. Es ist komischerweise keine deutsche ausführliche (Schritt-für-Schritt)-Anleitung zu finden. Habt ihr da Erfahrungen und könnt mir helfen?


RE: Adressen-Probleme... - iNvIcTUs oRCuS - 17.07.2012

(17.07.2012, 22:36)FPS-Player schrieb: ...mit dem Ergebnis, welches ich schon oben beschrieben habe - das Spiel stürzt ab, sobal ich "what writes/accesses to this adress" anklicke....

Nutzt Du nen Keks oder versucht Du das Ganze an Hand des Originals?

EDIT//
Just Cause wollte ich schon immer mal probieren...
Vielleicht schau ich mir das mal an...


RE: Adressen-Probleme... - FPS-Player - 18.07.2012

(17.07.2012, 23:59)sILeNt heLLsCrEAm schrieb: Nutzt Du nen Keks oder versucht Du das Ganze an Hand des Originals?
Ja, mit Keks...stimmt, daran hab ich gar nicht gedacht. Das wird wahrscheinlich sein. Allerdings gehts so ein bis zwei Mal gut, aber dann schmierts ab. Nur bei ArtMoney stürzt es komischerweise nicht ab...
Zitat:EDIT//
Just Cause wollte ich schon immer mal probieren...
Vielleicht schau ich mir das mal an...
Ok, Trainer gibt es für JC2 wie Sand am Meer, aber keinen (funktionierenden) für dieses "Minigame", bei dem man diese Codes eingeben muß, um etwas zu hacken. Leider bin ich tatsächlich (und das heißt bei mir schon was Cool ) zu langsam! Wobei die Anzahl der Ziffern, die man eingeben muß, ist schon recht lang und die Zeitspanne dafür sehr kurz Happy
Klar, schau es dir mal an (falls du tatsächlich einen machen solltest, dann würden mich Health, Ammo/NoReload, Money und der (ich weiß nicht, wie der richtig heißt) Mission Timer interessieren [es gibt zwei: einmal für den Code und einmal für die Agentur-Missionen - beide wäre schön]).

Dennoch würde ich mich selbst gerne nochmal daran probieren. Wenn also jemand was zu ArtMoney erzählen kann...? Wink


RE: Adressen-Probleme... - iNvIcTUs oRCuS - 19.07.2012

Also so wie's aussieht hat das Spiel was dagegen wenn man den Debugger aufschaltet und Breakpoints setzt. Dabei spielts keine Rolle ob es sich um Memory Breakpoints oder Hardware Breakpoints handelt. Und dieser Cheat Schutz ist auch im Keks von Skidrow noch enthalten...
Ferner glaub ich das Du da so auf die schnelle keinen brauchbaren Pointer findest. Aber - eine Code Injection ist hier definitiv auch eine einfache Lösung.

Original Code:
[code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code]
Sprung zur Codecave:
[code=ASM]JustCause2.exe+4103F0 - E9 F88F1400 - jmp JustCause2.exe+5593ED[/code]
Codecave:
[code=ASM]JustCause2.exe+5593ED - F3 0F10 46 44 - movss xmm0,[esi+44]
JustCause2.exe+5593F2 - F3 0F11 46 40 - movss [esi+40],xmm0
JustCause2.exe+5593F7 - E9 F96FEBFF - jmp JustCause2.exe+4103F5
JustCause2.exe+5593FC - 90 - nop[/code]

Und das war schon der Ganze Zauber...
Im FPU Register XMM0 steht der aktuelle Zeitwert. Dieser wird in die entsprechende Adresse [ESI+0x40h] geschrieben. Und an Adresse [ESI+0x44h] steht der maximale/volle Zeitwert...
Diesen vollen Zeitwert lasse ich quasi ins XMM0 Register schreiben, dann wird der Originalcode ausgeführt der durch den Jump zur Codecave überschrieben wird. Und letztenendes wird wieder raus aus der Codecave gesprungen zum weiteren Programmablauf.

grEEtZ sILeNt heLLsCrEAm


RE: Adressen-Probleme... - iNvIcTUs oRCuS - 20.07.2012

So Cheats sind soweit im Kasten.
Fehlt mir nur noch der Missions Timer Cheat.
Bin aber noch nicht so weit das ich diesen zur Verfügung habe...
Habe momentan nur die erste Festung eingenommen...


RE: Adressen-Probleme... - FPS-Player - 22.07.2012

Danke Silent für deine Mühe Smiling


Sorry, das ihr euch mit so einem Noob rumschlagen müsst, aber ich möchte das gerne wissen/draufkriegen - das kann doch nicht so schwer sein...? Ich danke euch, das ihr mir bis jetzt so geduldig geholfen habt und ich hoffe, das ihr mir jetzt auch noch zur Seite stehen könnt/wollt. Denn ich möchte gerne auf das obige explizit eingehen.

Leider bin ich noch nicht so weit, das oben stehende zu kapieren, wie ich gerade feststelle :(
Und ich glaube, dort liegt mein Hauptproblem. Deswegen "schreie" ich ja immer nach einer Step-by-Step-Anleitung Wink

Also, ich weiß, wie ich Adressen/Werte finde und ich weiß auch (theoretisch - wenn ich es denn mal hinbekomme und das Spiel nicht abstürzt), wie ich Pointer finde.
Aber da hört es dann auf. Mir fehlt einfach das Wissen/Verständnis um von meiner ermittelten Adresse/Pointer zur Code Injection/Codecave zu kommen.

Daher zerflücke ich jetzt einfach mal deine Codes um für mich persönlich die ganze Sache zu verstehen...

Also dies hier:

Code:
JustCause2.exe+4103F0 - F3 0F11 46 40

ist mir soweit klar, das bekomme ich ja, wenn ich den gefunden Wert/die Adresse (nicht den Pointer!) doppelt anklicke, bzw. mir das als Hexadezimalwert(e) anzeigen lasse. Das habe ich auch schon mal trainingshalber gemacht. Soweit eigentlich klar.

Aber was hat es hiermit auf sich:

Code:
- movss [esi+40],xmm0

Wo steht das, wie komme ich da ran und vor allem: was genau bedeutet das?

Zweitens, was ist das:

Code:
JustCause2.exe+4103F0 - E9 F88F1400

?
Der erste Teil ist bekannt, den hab ich ja oben schon stehen.
Aber woher kommt das E9 F88F1400? Und was bedeutet das?
Wieso komme ich von Anfangs F3 0F11 46 40 auf E9 F88F1400?

Drittens:
Das folgende erkläre ich mir so, das dies der Sprungbefehl (daher wohl das "jmp") zu Zeile/Programmcode XXX ist, damit der Pointer/die Code Injection greift, richtig?

Code:
- jmp JustCause2.exe+5593ED

Also der Sprung auf die Adresse, die bspw. die Munition bei Benutzung abzieht.
Ist das die +5593ED? Das heißt, das ist die wahre Adresse, auf der bspw. der Munitionswert angegeben ist, oder? Diese Adresse bekomme ich ja raus, wenn ich nach Pointer suche, stimmts?

Viertens (ich hab da zur Übersicht mal Ziffern davorgesetzt):
Das ist doch jetzt sozusagen die von dir geschriebene "Umleitung", die dem Originalcode sagt, er soll statt dem eigentlichen Wert XXX nun den Wert XYX nehmen / oder den Originalcode einfrieren. Richtig soweit?
Aber warum sind die obigen Werte jetzt auf einmal ganz anders?
[code=ASM]1. JustCause2.exe+5593ED - F3 0F10 46 44 - movss xmm0,[esi+44]
2. JustCause2.exe+5593F2 - F3 0F11 46 40 - movss [esi+40],xmm0
3. JustCause2.exe+5593F7 - E9 F96FEBFF - jmp JustCause2.exe+4103F5
4. JustCause2.exe+5593FC - 90 - nop[/code]
Zu 1.:
- Die +5593ED ist ja die richtige Adresse, von der die Muni abgezogen wird, stimmts?
- Wo kommt denn der Wert F3 0F10 46 44 unter 1. her? Der tauchte hier noch gar nicht auf...?
- die beiden "44" gehören zusammen, bzw. müssen bei diesem Vorgang gleich sein, richtig? (F3 0F10 46 44 - movss xmm0,[esi+44])
Zu 2.:
- Was ist dies für eine Adresse: +5593F7? Oder ist das nur die "Zeilennummer" in dem entsprechenden Abschnitt?
- Warum taucht mein zu allererst gefundener Wert denn erst unter 2. auf?
- auch hier: die beiden "40" gehören zusammen, bzw. müssen bei diesem Vorgang gleich sein, richtig? (F3 0F11 46 40 - movss [esi+40],xmm0)
Zu 3.:
- Woher kommt die Adresse: +5593F7? (Gleiche Frage wie oben)
- Und woher kommt die Adresse E9 F96FEBFF, die dann auf den "Jump"-Befehl - jmp JustCause2.exe+4103F5 verweisen soll, bwz. wo kommt plötzlich die +4103F5 her? Wie ermittele ich die? Ist das auch nur eine "Zeilennummer"?
zu 4.:
Ok, das sagt mir nun gar nichts mehr. Woher stammt die +5593FC und was bedeuted " - 90 - nop"? Vermutlich ist damit die "Umleitung" innerhalb des Programmcodes beendet?

Puh, ich stelle gerade fest, das ich ein ziemlicher Nerv-B00n bin... :-/
Mag sein, das mein Anspruch an mich selbst zu hoch ist, aber das ist doch erlernbar...? Ich glaube, wenn einer von euch mir das bis in die kleinste Zahl zerlegen und erklären kann, dann würde ich das begreifen und auch mal was an euch zurückgeben können...

Natürlich könnt ihr auch jetzt aussteigen und mir sagen, ich bin ein hoffnungsloser Fall, weil ich nicht mal das kleinste Quentchen bis jetzt verstanden habe. Dann wäre das aber auch ok, dann akzeptiere ich das. :exclamation:

Das ist wirklich eine Menge Stoff zum lernen.


RE: Adressen-Probleme... - iNvIcTUs oRCuS - 22.07.2012

Irgendwie scheint mir das Du dich zu sehr auf Pointer fixiert hast?!?
Von diesem Gedanken solltest Du dich ganz schnell trennen, denn nicht immer ist ein Spiel nur mit Pointern zu bescheißen...

In erster Linie solltest Du Dir auch das Codecave Tutorial von Acubra zu Gemüte führen... Das findest Du HIER

Bei diesem Code gibts nichts auseinanderzupflücken...
[code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code]
Der erste Teil beschreibt die Position wo diese Anweisung zu finden ist. Und da sehen wir das diese Anweisung in der "JustCause2.exe" an Adresse "JustCause2.exe+4103F0" zu finden ist. Und da die Basisadresse der EXE Datei im Speicher immer diesselbe ist, nämlich 0x400000h, so könnte ich auch statt "JustCause2.exe+4103F0" auch einfach nur "008103F0" schreiben. Weil, wenn ich zur Basisadresse von 0x400000h den Wert 0x4203F0h addiere ich eben den HEX Wert 008103F0 erhalte.
Die darauffolgenden Bytes sind die sogenannten Opcodes. Laienhaft ausgedrückt, das was der Computer versteht. Und da sich solche Bytefolgen schlecht merken lassen hat Gott den Dissassembler erfunden der diese Bytefolgen in verständliche Befehle umwandelt und wir bzw. ein Programmierer oder auch Cracker weiß was hier für Anweisungen über den Bildschirm flimmern.
Nur mal so am Rande und rein zur Info... Eine relativ Bekannte ASM Library ist die BEA Engine. Diese gibts z.B. hier.

Die XMM Register wurden damals von Intel eingeführt. Allen bekannt dürfte ja wohl das Kürzel SSE sein. Welches damals erstmals beim Pentium III eingeführt wurde. Insgesamt standen nun 8 128-Bit Register zur Verfügung, also die Register von XMM0 bis hin zum Register XMM7. Später wurden diese nochmals erweitert.
Mit der Anweisung "movss [esi+40], xmm0" wird also eine Gleitkommazahl aus dem XMM0 Register in den Speicher an Adresse [ESI+40] kopiert. Wenn jetzt z.B. ESI den Wert 0x400400h enthält dann wird also der Wert des Registers in den Speicher an Adresse 0x400400h + 0x40h = 0x400440h kopiert.
Der zusammengerechnete Wert von [ESI+40] ist in diesem Falle die Adresse die den Wert des Timers enthält. Also quasi wieviel Zeit wir noch haben bevor das Minigame als gescheitert gilt. Wenn also diese Adresse z.B. die "16BF06A2" ist, dann kann man auch zurückrechnen welcher Wert in ESI stehen muss. Wir ziehen also von dieser Timeradresse den Wert 0x40h ab. Also muss im ESI Register der Hexadezimale Wert "16BF0662" stehen.

Nun ist aber auch erstmal viel interessanter die Frage was wir eigentlich mit einer Codecave erreichen wollen? Oder anders gesagt, was bringt uns eine Codecave für Vorteile, zu welchem Zweck dient sie und bzw. oder warum sind wir darauf angewiesen???
In erster Linie muss amn sich vor Augen halten das dass was wir mit einer Codecave versuchen zu bezwecken vom Spiel so nicht vorgesehen ist. Und mit einer Codecave wollen wir ja auf gut Deutsch bescheißen und das erfordert meist eine Reihe von Befehlen die wir so im herkömmlichen Programmcode an besagten Stellen nicht unterbringen weil ganz einfach der Platz dazu nicht ausreicht.
Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang...
[code=ASM]F3 0F 10 46 44 - movss xmm0,[esi+44]
F3 0F 11 46 40 - movss [esi+40],xmm0[/code]
Also muss eben eine Codecave her. Und da wir durch den Sprung zu dieser Codecave den Originalcode "movss [esi+40],xmm0" überschreiben da können wir uns diesen auch gleich zu unseren Zwecken ausnutzen. Und da wir vom normalen Programmablauf zu unserer Codecave springen müssen wir natürlich von dieser Codecave auch wieder in den normalen Programmablauf wieder zurückspringen.

Die Codecave musst Du dir folgendermaßen vor Augen halten. Wenn das Spiel in seinem Ablauf, also die Spielfigur z.B. grade ne Bombe entschärft, an Adresse 008103F0 kommt dann führen wir nicht den normalen Code aus (also das die Zeit abläuft), sondern wir springen zur Codecave. Und das wird durch den Sprungbefehl "jmp JustCause2.exe+5593ED" erreicht. Das heißt wiederrum das dass Spiel dann unsere Codecave durchläuft.
Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken.
Also...
[ESI+40] = Tatsächlicher Zeitwert
Timer Adresse + 4 Bytes = Maximaler Zeitwert

Man könnte das auch so schreiben
[ESI+40+4] aber [ESI+44] ist ja dasselbe

Und mit dem Befehl "movss xmm0,[esi+44]" kopieren wir immer den maximal möglichen Zeitwert in das XMM0 Register. Und dort alleine nützt der uns nix also müssen wir das Spiel dazu bringen das es immer nur diesen Wert an der Adresse für den tatsächlichen Zeitwert hat. Das realisieren wir dann mit dem Befehl, welches auch der Originalcode ist, "movss [esi+40],xmm0".
Vereinfacht ausgedrückt sieht das im Spiel dann so aus wenn die Spielfigur eine Bombe entschärft der Balken, der der zur Verfügung stehenden Zeit entspricht, nicht mehr abnimmt.
Das wichtigste aber ist noch der Rücksprung, aus der Codecave zum weiteren Spielablauf. Das heißt wir müssen eine Zeile weiter im Code springen wo wir den Sprung zu unserer Codecave gemacht haben. Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen.

Noch etwas zum Abschluss... Eine Codecave ist kein vordefinierter Bereich innerhalb des Speichers. Eine Codecave befindet sich immer innerhalb des Spiels zur Verfügung stehenden Speichers. Dies kann feststehender Speicher innerhalb des Moduls sein, also der EXE. Oder man stellt dem Spiel Speicher zur Verfügung so das es diesen nutzen kann. Und genau das macht Cheat Engine mit dem Befehl oder der Option "Allocate Memory". Weiterhin darf sich aber die Codecave nicht innerhalb eines Bereiches befinden der vom Spiel explizit gebraucht wird.
Bestes Beispiel z.B. da wo sich der Originalcode befindet. Würde man da wild eine Codeinjection schreiben stürzt das Spiel unweigerlich ab weil es Daten bekommt die es nicht erwartet. Die Register kriegen falsche Werte, der Stack wird durcheinander gewürfelt. Letzenendes stimmt der komplette Programmablauf nicht mehr.
Aber eines muss man auch dazu sagen... Die oben gezeigte Codecave ist noch die einfachste Form. Sowas gibts noch viel komplexer und umfangreicher...


RE: Adressen-Probleme... - FPS-Player - 22.07.2012

Heiliger Odin! :exclamation:

Danke für die ausführliche Antwort.
Ok, das meiste habe ich vom schematischen Ablauf her verstanden.
(22.07.2012, 20:21)sILeNt heLLsCrEAm schrieb: Irgendwie scheint mir das Du dich zu sehr auf Pointer fixiert hast?!?
Von diesem Gedanken solltest Du dich ganz schnell trennen, denn nicht immer ist ein Spiel nur mit Pointern zu bescheißen...
Hähä, ich kenne mich nicht mal gut genug damit aus, um irgendwas draus zu machen Wink

Zitat:In erster Linie solltest Du Dir auch das Codecave Tutorial von Acubra zu Gemüte führen... Das findest Du HIER

Ja, danke, das hatte ich mir schon mal angesehen und auch begriffen, wie die Funktion einer Codecave ist/wie sie funktioniert.

Zitat:Bei diesem Code gibts nichts auseinanderzupflücken...
[code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code]
Der erste Teil beschreibt die Position wo diese Anweisung zu finden ist. Und da sehen wir das diese Anweisung in der "JustCause2.exe" an Adresse "JustCause2.exe+4103F0" zu finden ist. Und da die Basisadresse der EXE Datei im Speicher immer diesselbe ist, nämlich 0x400000h, so könnte ich auch statt "JustCause2.exe+4103F0" auch einfach nur "008103F0" schreiben. Weil, wenn ich zur Basisadresse von 0x400000h den Wert 0x4203F0h addiere ich eben den HEX Wert 008103F0 erhalte.
Aha! Das habe ich verstanden. Gilt denn die Basisadresse 0x400000h nur für Just cause 2 oder generell für jedes Spiel?

Zitat:Mit der Anweisung "movss [esi+40], xmm0" wird also eine Gleitkommazahl aus dem XMM0 Register in den Speicher an Adresse [ESI+40] kopiert. Wenn jetzt z.B. ESI den Wert 0x400400h enthält dann wird also der Wert des Registers in den Speicher an Adresse 0x400400h + 0x40h = 0x400440h kopiert.
Der zusammengerechnete Wert von [ESI+40] ist in diesem Falle die Adresse die den Wert des Timers enthält. Also quasi wieviel Zeit wir noch haben bevor das Minigame als gescheitert gilt. Wenn also diese Adresse z.B. die "16BF06A2" ist, dann kann man auch zurückrechnen welcher Wert in ESI stehen muss. Wir ziehen also von dieser Timeradresse den Wert 0x40h ab. Also muss im ESI Register der Hexadezimale Wert "16BF0662" stehen.

Ok, das habe ich "technisch" auch verstanden. Ob ich es auch selbst umsetzen kann (bei anderen Spielen) ist eine andere Geschichte...aber das muß ich halt lernen.

Zitat:Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang...
[code=ASM]F3 0F 10 46 44 - movss xmm0,[esi+44]
F3 0F 11 46 40 - movss [esi+40],xmm0[/code]
Also muss eben eine Codecave her. Und da wir durch den Sprung zu dieser Codecave den Originalcode "movss [esi+40],xmm0" überschreiben da können wir uns diesen auch gleich zu unseren Zwecken ausnutzen.
Halt! Überschreiben können wir den Code ja nicht, da sonst das Spiel abschmiert. Du meinst sicherlich, das wir sozusagen einen Bypass zu diesem Code legen - unsere Codecave...oder?

Zitat:Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken.
Also...
[ESI+40] = Tatsächlicher Zeitwert
Timer Adresse + 4 Bytes = Maximaler Zeitwert

Man könnte das auch so schreiben
[ESI+40+4] aber [ESI+44] ist ja dasselbe
Ah, also wäre - nur zur Verdeutlichung - der Timer, bzw. die Adresse [ESI+30] --> sprich ablaufende Zeit, müsste ich, wenn ich den max. Zeitwert einstellen wollte immer (also in jedem Fall/Spiel) 4 Bytes dazurechnen, so das ich dann auf [ESI+30+4] käme, also [ESI+34], richtig?

Zitat:Und mit dem Befehl "movss xmm0,[esi+44]" kopieren wir immer den maximal möglichen Zeitwert in das XMM0 Register. Und dort alleine nützt der uns nix also müssen wir das Spiel dazu bringen das es immer nur diesen Wert an der Adresse für den tatsächlichen Zeitwert hat. Das realisieren wir dann mit dem Befehl, welches auch der Originalcode ist, "movss [esi+40],xmm0".

Verstehe. Das Spiel geht zwar ganz normal auf den Wert des Timers "movss [esi+40],xmm0", welcher aber im Prinzip eine Codezeile weiter durch unseren max. Zeitwert wieder zurückgesetzt wird. Also fängt er quasi immer wieder neu an zu zählen...

Zitat:Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen.

Ok, auch verstanden! Aber woher weiß ich, das der Originalcode 5 Bytes groß war/ist?

Zitat:Noch etwas zum Abschluss... Eine Codecave ist kein vordefinierter Bereich innerhalb des Speichers. Eine Codecave befindet sich immer innerhalb des Spiels zur Verfügung stehenden Speichers. Dies kann feststehender Speicher innerhalb des Moduls sein, also der EXE. Oder man stellt dem Spiel Speicher zur Verfügung so das es diesen nutzen kann. Und genau das macht Cheat Engine mit dem Befehl oder der Option "Allocate Memory". Weiterhin darf sich aber die Codecave nicht innerhalb eines Bereiches befinden der vom Spiel explizit gebraucht wird.
Bestes Beispiel z.B. da wo sich der Originalcode befindet. Würde man da wild eine Codeinjection schreiben stürzt das Spiel unweigerlich ab weil es Daten bekommt die es nicht erwartet. Die Register kriegen falsche Werte, der Stack wird durcheinander gewürfelt. Letzenendes stimmt der komplette Programmablauf nicht mehr.
Klar, ich lagere also quasi meinen Code in einen ungenutzen, freien Speicherbereich aus und muß dem Originacode halt nur sagen, wo er unsere eingebaute Umleitung findet. "Springe ab Zeile 5 zu Zeile 20, führe Zeile 20 (welche normalerweise nicht genutzt wird) aus und fahre dann mit Zeile 6 fort" - vereinfacht ausgedrückt.

Zitat:Aber eines muss man auch dazu sagen... Die oben gezeigte Codecave ist noch die einfachste Form. Sowas gibts noch viel komplexer und umfangreicher...
Äh, danke, reicht fürs erste Happy

Gut, ich weiß nicht, ob ich es schaffe, das umzusetzen, aber ich werds auf jeden fall versuchen. Hmm, trotz CE oder AM muß man ja tatsächlich ein bisschen Programmieren können (oder zumindest etwas davon verstehen)... Junge Junge...




RE: Adressen-Probleme... - Acubra - 23.07.2012

Hey,
schön das du nicht aufgibst und versuchst immer weiter zu lernen. Weiter so!

(22.07.2012, 21:33)FPS-Player schrieb:
Zitat:Bei diesem Code gibts nichts auseinanderzupflücken...
[code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code]
Der erste Teil beschreibt die Position wo diese Anweisung zu finden ist. Und da sehen wir das diese Anweisung in der "JustCause2.exe" an Adresse "JustCause2.exe+4103F0" zu finden ist. Und da die Basisadresse der EXE Datei im Speicher immer diesselbe ist, nämlich 0x400000h, so könnte ich auch statt "JustCause2.exe+4103F0" auch einfach nur "008103F0" schreiben. Weil, wenn ich zur Basisadresse von 0x400000h den Wert 0x4203F0h addiere ich eben den HEX Wert 008103F0 erhalte.
Aha! Das habe ich verstanden. Gilt denn die Basisadresse 0x400000h nur für Just cause 2 oder generell für jedes Spiel?
Das gilt theoretisch für jede .exe. Also jedes Spiel, in dem die Cheats in einer .exe lokalisiert sind, haben die Basisadresse von 0x400000h. Wenn das Spiel jedoch über eine Dynamic Link Library z.B den ganzen Timerkram steuert, dann musst du erst die BaseAdresse der dll ausfindig machen. Wie das Wort dynamic (dynamisch) schon sagt, werden diese Libraries immer an andere Orte geladen.

(22.07.2012, 21:33)FPS-Player schrieb:
Zitat:Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang...
[code=ASM]F3 0F 10 46 44 - movss xmm0,[esi+44]
F3 0F 11 46 40 - movss [esi+40],xmm0[/code]
Also muss eben eine Codecave her. Und da wir durch den Sprung zu dieser Codecave den Originalcode "movss [esi+40],xmm0" überschreiben da können wir uns diesen auch gleich zu unseren Zwecken ausnutzen.
Halt! Überschreiben können wir den Code ja nicht, da sonst das Spiel abschmiert. Du meinst sicherlich, das wir sozusagen einen Bypass zu diesem Code legen - unsere Codecave...oder?
Nein, wir müssen den Originalcode überschreiben. Anders kommen wir ja nicht zur CodeCave. aus movss [esi+40], xmm0 wird Jmp AdresseCodecave. Deswegen müssen wir auch im Endeffekt den Originalcode wieder in die CodeCave schreiben, da sonst das Spiel nicht weiss was es machen soll.

(22.07.2012, 21:33)FPS-Player schrieb:
Zitat:Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken.
Also...
[ESI+40] = Tatsächlicher Zeitwert
Timer Adresse + 4 Bytes = Maximaler Zeitwert

Man könnte das auch so schreiben
[ESI+40+4] aber [ESI+44] ist ja dasselbe
Ah, also wäre - nur zur Verdeutlichung - der Timer, bzw. die Adresse [ESI+30] --> sprich ablaufende Zeit, müsste ich, wenn ich den max. Zeitwert einstellen wollte immer (also in jedem Fall/Spiel) 4 Bytes dazurechnen, so das ich dann auf [ESI+30+4] käme, also [ESI+34], richtig?
Nein, so einfach ist das leider nicht. Der sILeNt heLLsCrEAm hat sich die Struktur von der in ESI befindlichen Adresse angeguckt. Also folgendes Szenario:
ESI beinhaltet die Struktur zum Spieler (also wo Daten über den Spieler "gespeichert" werden)
in ESI+4 befindet sich z.B der Name
in ESI+8 die Lebenspunkte
in ESI+12 die Erfahrungspunkte
u.s.w
in Pseudocode sehe das folgendermaßen aus:

Code:
1
2
3
4
5
6
Struct Player
{
int iName;
int iHealth;
int iXP;
};

Jedoch ist das vom Programmierer abhängig. Er hätte die Struktur auch folgendermaßen aufbauen können:

Code:
1
2
3
4
5
6
Struct Player
{
int iHealth;
int iName;
int iXP;
};

Dann wäre bei ESI+4 die HP zu finden.

(22.07.2012, 21:33)FPS-Player schrieb:
Zitat:Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen.

Ok, auch verstanden! Aber woher weiß ich, das der Originalcode 5 Bytes groß war/ist?
Dazu guckst du dir einfach die Opcodes des Befehls (F3[1] 0F[2] 11[3] 46[4] 40[5]) an.



(22.07.2012, 21:33)FPS-Player schrieb: Hmm, trotz CE oder AM muß man ja tatsächlich ein bisschen Programmieren können (oder zumindest etwas davon verstehen)... Junge Junge...
Es ist auf jeden Fall nicht kontraproduktiv Happy