Home of Gamehacking - Archiv
Kleine Hilfe zu WriteProcessMemory gesucht... - Druckversion

+- Home of Gamehacking - Archiv (http://archiv-homeofgamehacking.de)
+-- Forum: Coding (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=15)
+--- Forum: Delphi (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=20)
+--- Thema: Kleine Hilfe zu WriteProcessMemory gesucht... (/showthread.php?tid=1175)

Seiten: 1 2 3 4 5 6 7


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 20.09.2012

Ich denke mal das ist bei diesem Titel genauso wie bei den anderen C&C Teilen. Da wird das eingesammelte Geld verrechnet und zu diesem Wert wird das Startkapital der Mission dazuaddiert... Beide Werte werden auch permanent gelesen.
Du müsstest also, wenn dem so ist, einen lesenden Codeabschnitt suchen und da mit deiner Codecave ansetzen.

EDIT//
Übrigens...
Reden wir hier immer noch über Command & Conquer Generals???
Ich müsste hier irgendwo noch die 10 Jahre Edition da haben, da könnte ich mir das mal mit anschauen.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 20.09.2012

Hmm das mit dem lesenden Codeabschnitt versteh ich nicht so ganz... Muss ich jetzt eine Stelle finden, auf die immer wieder zugegriffen wird und wie finde ich eine solche Stelle? Gibt es da eine Möglichkeit, direkt danach zu suchen? Und von wo aus muss ich suchen? Vom Wert selber aus, oder von der schreibenden Stelle aus?

LG Darius83


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 20.09.2012

Ich wiederhole mal meinen letzten Beitrag...

(20.09.2012, 19:25)sILeNt heLLsCrEAm schrieb: EDIT//
Übrigens...
Reden wir hier immer noch über Command & Conquer Generals???
Ich müsste hier irgendwo noch die 10 Jahre Edition da haben, da könnte ich mir das mal mit anschauen.



RE: Kleine Hilfe zu WriteProcessMemory gesucht... - Acubra - 20.09.2012

(20.09.2012, 20:06)darius83 schrieb: Hmm das mit dem lesenden Codeabschnitt versteh ich nicht so ganz... Muss ich jetzt eine Stelle finden, auf die immer wieder zugegriffen wird und wie finde ich eine solche Stelle? Gibt es da eine Möglichkeit, direkt danach zu suchen? Und von wo aus muss ich suchen? Vom Wert selber aus, oder von der schreibenden Stelle aus?

LG Darius83

Hey,
du musst einen Codeabschnitt finden, indem deine Adresse ständig gelesen wird. Das kannst du ganz einfach mit Cheat Engine realisieren, indem du einen Rechtsklick auf deine Adresse machst und dann "Find out what accesses this address" wählst. Dann bastelst du ne CodeCave, in der du die GetAsyncKeyState API callst (natürlich in ASM). Dann musst du noch kontrollieren welche Taste gedrückt wurde und dementsprechend deinen Code ausführen lassen oder nicht.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 20.09.2012

Öhm

@sILeNt heLLsCrEAm
Hab deinen Edit grad wohl überlesen...
Ja reden noch von Generals.
Hab allerdings auch noch den Zusatz Stunde Null drauf, da hab ich auch schon ein paar mehr Adressen gefunden XD
Allerdings keine, die permanent auf irgendwelche Werte zugreift...


@Acubra
Ui... da wirds wohl etwas komplizierter...
in der du die GetAsyncKeyState API callst (natürlich in ASM)?!
Naja mal schaun Wink
Und was mache ich, wenn ich keinen permanenten Zugriff finde?
Ich sage jetzt mal speziell zum Beispiel das Generalslevel, dort bekomme ich nur einen Lesezugriff, wenn sich der Wert auch wirklich ändert...
Muss ich da eventuell über die Erfahrungspunkte gehen, die benötigt werden, um ein Levelup zu erreichen?

LG Darius83


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - Acubra - 20.09.2012

(20.09.2012, 21:15)darius83 schrieb: @Acubra
Ui... da wirds wohl etwas komplizierter...
in der du die GetAsyncKeyState API callst (natürlich in ASM)?!
Naja mal schaun Wink
Und was mache ich, wenn ich keinen permanenten Zugriff finde?
Ich sage jetzt mal speziell zum Beispiel das Generalslevel, dort bekomme ich nur einen Lesezugriff, wenn sich der Wert auch wirklich ändert...
Muss ich da eventuell über die Erfahrungspunkte gehen, die benötigt werden, um ein Levelup zu erreichen?

Hey,
das mit dem GetAsyncKeyState sieht in nem Cheat Engine Auto Assemble Script z.B so aus:

Code:
1
2
3
4
5
6
7
8
pushfd //flags speichern
pushad //register (eax reicht eigentlich)
push '1' //welche taste
call GetAsyncKeyState //api callen
shr ax,0F //ax um 0F "nach rechts verschieben"
cmp ax,1 //taste gedrückt?
popad //register wiederherstellen
jne originalcode //wenn taste nicht gedrückt, dann originalcode ausführen




RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 21.09.2012

Man muss nich unbedingt nochmal GetAsync callen...
Geht mit nem simplen Hilfsbyte einfacher... Nen simpler Additionscheat halt...

Wie gesagt, ich schau mir das mal kurz an...


EDIT//
So ich hab mir das mal schnell angeschaut. Der Einfachheit halber hab ich dafür nen Keks aufgespielt.
Das was Du suchst befindet sich hier...
[code=ASM]game.dat+10A65B - 74 78 - je game.dat+10A6D5
game.dat+10A65D - 8B 58 38 - mov ebx,[eax+38] //[eax+38] = Geldadresse
game.dat+10A660 - 39 1D 68699E00 - cmp [game.dat+5E6968],ebx
game.dat+10A666 - 74 60 - je game.dat+10A6C8[/code]
Allerdings hab ich mir nur mal die erste Mission angeschaut, die wo man den Güterbahnhof übernehmen und halten muss. Fraktion war glaub ich die "Westliche Allianz". Es könnte aber durchaus sein das in anderen Missionen und/oder Fraktionen sich ein entsprechender Code an anderer Stelle befindet.


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - darius83 - 25.09.2012

(21.09.2012, 08:06)sILeNt heLLsCrEAm schrieb: Man muss nich unbedingt nochmal GetAsync callen...
Geht mit nem simplen Hilfsbyte einfacher... Nen simpler Additionscheat halt...

Wie gesagt, ich schau mir das mal kurz an...


EDIT//
So ich hab mir das mal schnell angeschaut. Der Einfachheit halber hab ich dafür nen Keks aufgespielt.
Das was Du suchst befindet sich hier...
[code=ASM]game.dat+10A65B - 74 78 - je game.dat+10A6D5
game.dat+10A65D - 8B 58 38 - mov ebx,[eax+38] //[eax+38] = Geldadresse
game.dat+10A660 - 39 1D 68699E00 - cmp [game.dat+5E6968],ebx
game.dat+10A666 - 74 60 - je game.dat+10A6C8[/code]
Allerdings hab ich mir nur mal die erste Mission angeschaut, die wo man den Güterbahnhof übernehmen und halten muss. Fraktion war glaub ich die "Westliche Allianz". Es könnte aber durchaus sein das in anderen Missionen und/oder Fraktionen sich ein entsprechender Code an anderer Stelle befindet.

Ich habs mir grad mal angeschaut. Wenn ich das richtig verstanden habe, wird der Wert an der Geldadresse nach ebx geschrieben, anschliessend mit [game.dat+5E6968] verglichen und wenn beide identisch sind, wird ein Sprung ausgeführt.

Wenn ich das weiter richtig verstanden habe, soll ich jetzt eine Codecave schreiben, die ebx vor dem Vergleich ändert.

Könnte man theoretisch so machen, dass man bei Tastendruck ein bestimmtes Byte im Speicher von 00 auf 01 setzt, wenn das der Fall ist, erhöhe ebx um 5000 und setze Byte zurück auf 00, ansonsten belasse den Wert so.

Hmm mal schaun, ob ich das jetzt auf die Reihe bekomme...
Beispielsweise meine Cave beginnt bei Adresse 02360000

Code:
1
2
3
4
5
6
02360000 01 // Dieses Adressbyte wird via Tastendruck gesetzt
02360001 cmp [02360000], 00 // Hier springt der Code vom Original hin
         je originalcode
         mov [02360000], 00
         mov ebx, ebx+1388
         jmp originalcode

So in etwa könnte ich mir das jetzt gerade vorstellen...
Ich hab jetzt allerdings 2 Anliegen...
1. Hab ich das so richtig verstanden und wäre die Umsetzung so korekt?
2. Wie hast du diese Stelle gefunden?

LG Darius83


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - iNvIcTUs oRCuS - 25.09.2012

Im Prinzip hast Du das schon richtig verstanden, aber mit der Codecave haperts noch ein bisschen... Smiling

Wie habe ich die Adresse/den Code gefunden?
Der Screenshot zeigts eigentlich...
[attachment=1181]

Nun zur Codecave...
Erstes Problem ist hier das durch den Sprung zur Codecave auch der Befehl
[code=ASM]cmp [game.dat+5E6968],ebx[/code]überschrieben wird. Das heißt das der CMP inklusive dem bedingten Sprung auch in der Codecave mit reinmuss...

Z.B. könnte man das so lösen...
Der Sprung zur Codecave erfolgt von "game.dat+10A65D"
[code=ASM]00400410 - 80 3D 00044000 01 - cmp byte ptr [00400400],01 // Hilfsbyte gesetzt Ja/Nein?
00400417 - 75 0E - jne 00400427 // Wenn nicht dann weiter zum Originalcode
00400419 - 81 40 38 10270000 - add [eax+38],00002710 // Ansonsten - Addiere 10.000 zum bestehenden Betrag
00400420 - C6 05 00044000 00 - mov byte ptr [00400400],00 // Nicht vergessen Hilfsbyte zurücksetzen ansonsten wird immer wieder hinzuaddiert
00400427 - 8B 58 38 - mov ebx,[eax+38] // Originalcode
0040042A - 39 1D 68699E00 - cmp [game.dat+5E6968],ebx // Originalcode
00400430 - 0F84 92A21000 - je game.dat+10A6C8
00400436 - E9 2DA21000 - jmp game.dat+10A668
[/code]


RE: Kleine Hilfe zu WriteProcessMemory gesucht... - Acubra - 25.09.2012

Hey,
das hast du so richtig verstanden.

Den freien Code kann man ganz einfach mit Cheat Engine finden. Im Memory Assembler gibt es eine Funktion die nennt sich "Scan for CodeCaves" im Tools Menü.

Bei sILeNt heLLsCrEAm's CodeCave würde ich jedoch zunächst die Flags speichern (pushfd/popfd), da du durch den cmp (compare) Befehl das Z-Flag veränderst.