Home of Gamehacking - Archiv

Normale Version: Command & Conquer Generäle - Die Stunde Null - Patch 1.4
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Ok, nach langen Diskussionen im Delphi-Bereich über eben dieses Spiel bin ich jetzt mal hierher gewechselt, da ich denke, dass es so langsam besser hier rein passt Wink

Hier nochmal der Verweis in die anfängliche Diskussion

Also, das Thema Gold ist hier erstmal abgehakt, mit den verfügbaren Generalsfähigkeitspunkten bin ich gerade am testen, aber ich hab Schwierigkeiten, eine Codestelle zu finden, in der das Generalslevel permanent überprüft wird... Alternativ wäre es denke ich eine Möglichkeit, die Stelle der Erfahrungspunkte rauszusuchen, aber auch da habe ich bisher noch nichts gefunden...

Hat da eventuell einen Tip oder eine Idee, wie man das ganze findet?

Soll im Endeffekt darauf hinauslaufen, dass man via Hotkey sein Generalslevel auf Stufe 5 bringt und genügend Generalspunkte zur Verfügung hat, um alle Fähigkeiten zu erlernen.

LG Darius83

Edit1:
Hier mal, was ich so gefunden habe...

[code=asm]
game.dat+3C91E0 - 8B 86 8C010000 - mov eax,[esi+0000018C] // [esi+0000018C] enthält die momentanen Erfahrungspunkte
game.dat+5BCDE - 8B 83 88010000 - mov eax,[ebx+00000188] // [ebx+00000188] enthält GeneralslevelWert
game.dat+5EAEC - 8B 81 90 01 00 00 - mov eax,[ecx+00000190] // [ecx+00000190] enthält GeneralspunkteWert
[/code]

5000 Erfahrungspunkte braucht man für Lvl 5. Wenn ich die allerdings einfach setze, erfolgt das Levelup erst nach dem nächsten Kill eines Gegners...
Anscheinend fehlt mir da noch irgendwo ein Flag oder ähnliches, um das Lvlup auszulösen...
Ja man könnte es mit einem Flag versuchen ungefähr so

PHP-Code:
pushad // push register auf stack
cmp [00587857],1 // Vergleiche ob Flag gesetzt
jne orginal code // Wen ja dann zum orginal code
mov [00587857],0 // wen nicht dann setze flag 0
push eax // Push eax auf stack
mov eax,1388 ( 5000 ) // Setze in eax den wert 1388 Hex ( 5000 Dezi )
add [esi+0000018C],eax // kopiere  den wert aus eax nach esi und addiere in hinzu
popad // hole register von stack


00587857 Ist einfach ein freies Cave.

Nein, so meinte ich das nicht... Flag für den Tastendruck ist klar... Ich meine eher, ich kann zwar die 5000 Erfahrung setzen, aber dadurch erhöht sich mein Level Ingame nicht... Dazu muss ich dann anschliessend irgendwo eine gegnerische Einheit töten. Da ich aber eigentlich sofort ein Levelup haben will, fehlt mir in der Spielmechanik noch irgendwo ein Ereignis, das durch den Kill der gegnerischen Einheit ausgelöst wird, welches ich bisher nicht finden konnte :/

LG Darius83
Die sollte aber auch klar sein das es nicht in jedem Spiel IMMER eine permanent lesende Stelle im Code gibt.
Beispielsweise bei Rollenspielen ist es durchaus üblich das z.B. der Geldwert erst beim öfnnen de Inbentares gelesen/abgeglichen wird.
Und das wird wohl hier genauso der Fall sein. Im Endeffekt kannst Du da nicht viel machen als es so zu belassen, denn wenn Du über Pointer gehst würdest Du ebenfalls erst aufsteigen nachdem Du eine gegnerische Einheit erledigt hast.
Ja das kann schon sein, aber jetzt mal rein theoretisch gesehen werden bei einem Kill einer gegnerischen Einheit mehrere Sachen ausgeführt, je nachdem, welche Seite man spielt, bekommt man z.B. Gold, Erfahrungspunkte, die Anzahl getöteter Einheiten erhöht sich... Wenn man jetzt im Code die Stelle findet, die die Erfahrungspunkte nach einem Kill erhöht, sollte man auch nachvollziehen können, was dabei abgefragt wird um zu prüfen, ob ein Levelup stattgefunden hat. Wenn man soweit ist, kann man das dann auch manuell aufrufen. Sogesehen, wäre es theoretisch möglich, ein Levelup manuell durchzuführen, wenn man die entsprechende Stelle im Code finden kann.

Bezogen auf dein Rollenspiel-Beispiel könnte man dem Programm z.B. vorgaukeln, dass sich das Inventar geöffnet hat, um die Aktualisierungsroutine zu starten und den aktuellen Wert zu bekommen.

Was mich wieder zum selben Problem führt, ich finde die entsprechende Stelle nicht :/

LG Darius83
Möglich wäre das rein theoretisch ...
Aber das rechtfertigt nicht den Aufwand/Nutzen Faktor Wink
Sagen wir mal so ... wenn du den cheat jetzt so lässt, muss der Benutzer
einen Gegner killen und bekommt dann LevelUP, XP, usw.

Wenn du aber das ganze anders haben möchtest, investierst du
z.B. 1,5 Std. darin nur damit der Benutzer den Gegner nicht killen
muss.

Wenn ich deinen Trainer nutzen würde, wäre die erste Variante
für mich vollkommen ok ... hauptsache ich bekomme das, was dein
Trainer verspricht Wink
Genau es reicht so volkommen. Nur ist es wohl bei im der reiz es so zu machen (probieren) es hinzubekommen wie er es sich vorstellt. Denke diejenigen von euch die mit unter trainer erstellen wissen was ich meine:sleepy:.

Chris
Tja das ist der Nachteil bei Perfektionisten :/ Machen sich immer mehr Arbeit als nötig XD Naja Perfektionist bin ich zwar nicht, deswegen versuche ich aber trotzdem alles so gut wie möglich zu machen, wenn es denn möglich ist Wink

LG Darius83
In deinem Falle wie Du es versuchst zu handlen würde ich davon abraten und nicht erst weiter versuchen eine entsprechende Funktion zu finden.
Erstens... DNA hats bereits angesprochen, der Aufwand ist einfach zu groß.
Zweitens... Wenn Du versuchst die Funktion manuel aufzurufen stehst Du vor einem weiteren Problem... Du müsstest die Funktion nur die Adresse/Werte etc. durchlaufen lassen die mit dem Level UP, oder was Du eben versuchst zu manipulieren, zusammenhängen. Und das dürfte auch einen ehrfahrenen Hacker aus der Bahn werfen.
Sicher, es wird manche Spiele geben bei denen das einfach funktioniert, aber bei einem Strategietitel wohl eher weniger. Das sind zu viele Variablen...

Es steht Dir natürlich frei es zu versuchen. Du müsstest z.B. mit Hilfe von Cheat Engine einen Befehl mittels "Find out what accesses..." finden. Den ersten Befehl musst Du folglich im Debugger nachvollziehen. Logischerweise wird wohl irgendwo im Code-Nirvana ein oder mehrere Call(s) übersprungen die dafür sinnvoll sind.
Hey,
ich glaube du müsstest eine bestimme Funktion hooken und von der aus dann die "Level Up" Routine mit den jeweiligen Parametern callen.
Allein das Thema hooken ist extrem kompliziert und meiner Meinung nach nur etwas für extrem Fortgeschrittene, denn: Command & Conquer wurde ja auch ganz normal programmiert. Du musst für einen Hook nun erst einmal die richtige Funktion finden (erfordert schon einiges an Reversing Skills). Dann musst du die komplette Funktion analysieren und nachvollziehen, um auf die richtigen Paramter (theoretisch könnte man auch alle als DWORD deklarieren), Rückgabewert (void, 4bytes, 8bytes u.s.w) und Calling Conventions (__thiscall, __stdcall, __fastcall, __cdecl) zu kommen. Außerdem müsstest du dann noch von da aus ne andere Funktion callen.
Außerdem müsstest du dafür eine .dll injizieren.
Seiten: 1 2