PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Memory] Adressen, Pointer ecetera



ir0n
26.07.2009, 16:09
Hi.
Hab gerade mal wieder Freude am herausfinden von Adressen bekommen und bin deshalb wieder am gleichen Problem, vor dem ich damals stand und weswegen ich damit schleunigst wieder aufgehört habe.

Ich erkläre das ganze mal an einem Beispiel.

1. Wir haben ein Spiel, welches eine Klasse für Spieler enthält:
class CPlayer
{
public:
CPlayer(const char *pszName);
void spawn(void);
// ...

private:
const char *m_pszName;
int m_iHealth;
Weapon m_Weapon;
Vector m_vecPosition;
};2. Wir gehen davon aus, dass 10 Spieler im Spiel sind, denmach gibt es 10 Instanzen der Klasse CPlayer
3. Wir finden die Adresse der Lebenspunke (Health) heraus (für mich selber und alle anderen Spieler)
4. Jetzt müssten wir die Basis der untersten (ersten) Instanz herausfinden
5. Dann noch herausfinden wie groß die Spielerklasse ist (ist ja nicht bekannt, dass da oben ist nur eine Annahme)
6. Wenn man alles das zusammen hat, kann man loslegen

So - ab Punkt 4 geht es für mich los, dass ich nicht mehr weiterkomme. Wie zum Teufel komm ich auf Größe der Spielerklasse und wie finde ich heraus, wo die erste Instanz beginnt?
Wenn man alles zusammen hat, kann man eigentlich ganz einfach fortfahren, richtig?
unsigned long nBase = 0x00002000; // natürlich Schwachsinn
unsigned int iSize = 0x7; // stimmt das überhaupt so? Meine Annahme: Klasse + 2 Funktionen + 4 Member
unsigned int iNameOffset = 0x3;
unsigned int iHealthOffset = 0x4;
unsigned int iPlayers = 10;

for (unsigned int i = 0; i < iPlayers; i++)
{
unsigned long nAddress = nBase + i * iSize;
cout << *((const char*)(nAdresse + iNameOffset)) << " hat " << *((int)(nAdresse + iHealthOffset)) << " Lebenspunkt!" << endl;
}Ich hoffe meine Annahme ist so richtig und jemand kann mir dabei helfen :)

Gruß

]=-antr4xx-=[
27.07.2009, 12:06
const char *m_pszName;
int m_iHealth;
Weapon m_Weapon;
Vector m_vecPosition;

ein pointer hat immer 4 Bytes
int hat auch vier bytes
Weapon hat sizeof(Weapon) bytes
Vector hat sizeof(Vector) bytes

Basis: int pointertobasis = (int) &ersteInstanz;

Das ganze klappt nur wenn du ein Array von der Klasse hast, mal so nebenbei bemerkt.

Ich hoffe ich konnte dir etwas weiterhelfen.

ir0n
27.07.2009, 17:14
Hi.
Das mit der Basis ist mir klar, nur wie komme ich an die erste Instanz und wo weiß ich, wo sie anfängt? Und wie kriegt man den Array? Ich habe mir so vorgestellt, dass wenn man mehrere Adressen zu Lebenspunkten sucht, dass man dann ein Muster an Adressen erkennt, so dass z.B. die Lebenspunkteadressen immer einen Abstand von z.B. 0x20 haben. Dann wüsste ich, dass eine Klasse 0x20 Groß ist.

Gruß

ed0x
07.08.2009, 04:05
das is doch schmarn ...

der speicher wird ya nicht unbedingt "hintereinander" reserviert ...

es kann sein das dazwischen riesen große abstände sind usw ...

wenn ich deine frage jetzt mal genau checken würde, könnte ich dir evtl weiterhelfen...

was willst du denn eigendlich genau machen jetz?!