Servus!
Ich versuche mich gerade bei DarkSoulsIII daran, dass Gegner Schaden bekommen und ich nicht.
Ich hab schon herausgefunden wie ich mich evtl. identifizieren kann, mein Problem ist, dass wenn dann eines der drei Szenarien passiert:
Monster und Ich bekommen trotzdem Schaden
Keiner bekommt Schaden
Spiel verabschiedet sich
Hier erst einmal der Code:
Code:
pushf
cmp [rbx+00000130], c0000
je further
mov [rbx+000000D8],eax //Wenn also nicht der Player, damage zufügen
further:
popf
|
Es ist egal wie ich es mache:
Das c0000 ist dabei wahrscheinlich das einzigartige meines Charakters
[rbx+00000130] ist dabei ein Text von 6-Zeichen Länge
Als andere Möglichkeit dachte ich mir, dass ich einfach den Integer-Wert von [rbx+00000130] nehme. Gesagt getan:
Code:
pushf
push ebx
cmp ebx, 3145827
je further
mov [rbx+000000D8],eax //Wenn also nicht der Player, damage zufügen
further:
pop ebx
popf
|
Tadaa, wir bekommen beide keinen Schaden!
Und da mein Gegner den Wert 3211363 hat, muss ja irgendwas am Code falsch sein...
Hoffe einer kann mir helfen ^^
Könntest du etwas mehr von deinem Code hier posten?
Am besten die komplette CI inkl. jmp von und zur cave und dem originalcode.
Na klar - danke schonmal für die Antwort!
Wobei genau das der Originalcode ist:
mov [rbx+000000D8],eax
Ist das 3145827 der Integer Wert aus ebx?
Wenn ja, dann musst du diesen entweder in Hex umwandeln, um ihn mit
EBX zu vergleichen, oder du musst es in CE so schreiben
EDIT
Und da du EBX ja nur vergleichst, kannst du dir push und pop eigentlich sparen
Vielen Dank erst mal für die Hilfe!
Ich hab mal das (int) davor geschrieben
Code:
Und: Das Spiel stürzt ab
Edit:
Dachte man müsste push ebx machen, wenn man den Wert verändert und pop ebx, damit der alte Wert in den Speicher zurück kommt und das Spiel nicht mit meinem Wert fortfährt?
Aber gut, Dankeschön!
Lösung:
Es funktioniert nun!
Mir ist was bei den Registern aufgefallen:
Das EAX-Register wollte ich nicht nutzen, da bei dem Befehl:
eben EAX irgendwo hinein geschoben werden würde und ich nicht wusste, ob es fatal wäre:
Code:
cmp eax, (int)....
pop eax
jz further
|
zu schreiben, weil ich ja eben compare und danach eax "zurücksetze".
Denke jedoch nicht dass es zu einem Fehler führen würde..
Also hab ich das EBX-Register genutzt und eben gesehen, dass ja in das RBX-Register geschrieben wird... also in die "längere" Version des EBX - ich den Wert von EBX aber geändert habe!
Hab nun also EDX genommen und Tada! Es funktioniert!
Für die Interessenten:
Vielen Dank für die Hilfe, DNA!
Welches Register Du letztenendes nimmst ist völlig egal...
Es kommt nur drauf an wie du deine Codecave schreibst...
Mit EAX und EBX hätte das auch funktioniert, aber wenn Du dir schon eine
eigene Lösung erarbeitet hast ist doch gut. Weiter so...
Ürigens... Bei diesem Spiel gibt es auch eine Memory Check Routine...
Nur mal so als Tipp...
Danke für den Tipp, iNvIcTUs oRCuS.
Jedoch bin ich erst seit neuerem in diesem Gebiet unterwegs und muss daher gestehen, dass ich nicht weiß, was diese Memory Check Routine ist.
Wenn ich raten müsste würde ich darauf tippen, dass es etwas mit AntiCheat zu tun hat. In dem Sinne, dass das Spiel Veränderungen im Speicher bemerkt und diese an den Server meldet. Bin ich da soweit richtig?
Grüße
Ist insofern richtig... Das Spiel sendet aber nix an einen Server...
Es prüft sich nur selbstständig auf Veränderungen im Speicher und schreibt einfach die
Originalcodes wieder zurück... Quasi so als wäre gar kein Cheat ausgeführt worden.
Wenn ich das noch richtig in Erinnerung habe auch nur dann wenn man einen Cheat mit
Erfahrungspunkten realisieren will...
Übrigens... Wegen Deiner Lösung...
Wenn das hier Deine Lösung ist:
ASM Code
newmem:
pushf
push edx
mov edx, rbx
mov edx, [edx+130]
cmp edx, (int)3145827
je further
mov [rbx+000000D8],eax //Wenn also nicht der Player, damage zufügen
further:
pop edx
popf
code:
|
Dann könnteste das auch gleich so schreiben...
Is kürzer und mit verlaub... Auch eleganter... ;-)
ASM Code
newmem:
cmp [rbx+130], (int)3145827
je Code
mov [rbx+000000D8],eax //Wenn also nicht der Player, damage zufügen
Code:
|
grEEtZ iNvIcTUs
Danke für die Antwort, Invictus!
Also bis jetzt hat alles funktioniert, was ich erreichen wollte - soll heißen es wurde noch nichts wieder zurück geschrieben.
Deine Verbesserung ist wirklich gut, muss ich sagen!
Danke für den Hinweis
Grüße
Edit: Du hattest Recht. Nach einer Weile wurde der Speicher wieder zurückgesetzt