Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung | Nächste Überarbeitung Beide Seiten, nächste Überarbeitung | ||
skripten:engineforschung [2018/09/09 17:10] mud-freak [Register] |
skripten:engineforschung [2018/09/09 17:12] mud-freak [Register] |
||
---|---|---|---|
Zeile 96: | Zeile 96: | ||
==== ECX ==== | ==== ECX ==== | ||
ECX ist zwar ein Zählerregister für Schleifen, ist aber hier aus anderem Grund für uns interessant. Die //Calling Conventions//, die man evtl. aus C und C++ kennt, sind verschiedene Arten wie eine Funktion aufgerufen wird (z.B. wird der Stack von der Funktion selbst aufgeräumt oder muss das der Aufrufer machen?, usw.). Eine dieser //Calling Conventions// ist %%__%%thiscall. Während normale Argumente immer auf den Stack (siehe [[#ESP|ESP]]) gelegt und so der aufgerufenen Funktion bereitgestellt werden, wird ''this'' für eine solche Funktion in ECX abgelegt. | ECX ist zwar ein Zählerregister für Schleifen, ist aber hier aus anderem Grund für uns interessant. Die //Calling Conventions//, die man evtl. aus C und C++ kennt, sind verschiedene Arten wie eine Funktion aufgerufen wird (z.B. wird der Stack von der Funktion selbst aufgeräumt oder muss das der Aufrufer machen?, usw.). Eine dieser //Calling Conventions// ist %%__%%thiscall. Während normale Argumente immer auf den Stack (siehe [[#ESP|ESP]]) gelegt und so der aufgerufenen Funktion bereitgestellt werden, wird ''this'' für eine solche Funktion in ECX abgelegt. | ||
+ | |||
+ | {{:skripten:engineforschung:getname.png?400 | oCNpc::GetName }} | ||
Speziell bedeutet das, dass in der Funktion ''oCNpc::GetName'' der NPC in Frage in ECX zur Verfügung steht. ECX ist in diesem Falle also ein Zeiger auf ein oCNpc-Objekt. Schauen wir in die Funktion sehen wir, dass an Adresse ''0x72F825'' auf ''ecx+124h'' Bezug genommen wird. 124h ist hexadezimal für 292. In der Klasse oCNpc (dokumentiert in Ikarus) finden wir an Offset 292 die Klassenvariable ''name''. Die Funktion tut also was sie verspricht: Sie holt den Namen eines des NPC. Würden wir ''oCNpc::GetName'' hooken (aus welchem irrsinnigen Grund auch immer) könnten wir in Daedalus über ECX an den NPC herankommen. | Speziell bedeutet das, dass in der Funktion ''oCNpc::GetName'' der NPC in Frage in ECX zur Verfügung steht. ECX ist in diesem Falle also ein Zeiger auf ein oCNpc-Objekt. Schauen wir in die Funktion sehen wir, dass an Adresse ''0x72F825'' auf ''ecx+124h'' Bezug genommen wird. 124h ist hexadezimal für 292. In der Klasse oCNpc (dokumentiert in Ikarus) finden wir an Offset 292 die Klassenvariable ''name''. Die Funktion tut also was sie verspricht: Sie holt den Namen eines des NPC. Würden wir ''oCNpc::GetName'' hooken (aus welchem irrsinnigen Grund auch immer) könnten wir in Daedalus über ECX an den NPC herankommen. |