Problem mit Adresse aus IDA

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich versuche momentan für Lernzwecke ein Programm zu schreiben, das aus einem Windowsspiel den Speicherstand rausliest. Damit will ich meinen Umgang mit IDA bisschen fördern.

Ich habe herausgefunden, dass eine globale Instanz der Klasse existiert, welche den Spielstand beinhält, in IDA ist das folgendermassen:
Code:
.data:01097074 ; class GameInstance * g_pGameInstance

Für mich heisst das, dass da die Adresse der globalen Instanz steht. Ich beachte auch noch, dass gilt:
Imagebase : 1000000

Und habe folgenden Code verwendet:
Code:
DWORD g_Game = 0;
if(FALSE == ReadProcessMemory(hProcess, (LPCVOID)0x97074, &g_Game, 4, 0))
{
	std::cout << "Error reading memory at 0x" << std::hex << 0x97074 << "! (" << GetLastError() << ")" << std::endl;
	std::cin.sync();
	std::cin.get();
	return 0;
}

Das funktioniert soweit eigentlich. Nur hat die Sache einen Hacken. g_Game ist nacher 0x30000. Dies ist nicht möglich. Ich weiss, dass GameInstance virtuelle Funktionen hat, aber [[g_Game]] (also die Addresse der 1ten vituellen Funktion ([__vfPtr])) lässt sich zum Beispiel schonmal nicht auslesen.

Auch finden sich in IDA solche Sachen:
Code:
.text:01031F8F                 mov     eax, ?g_pGameInstance@@3PAVGameInstace@@A ; GameInstance * g_pGameInstance
.text:01031F94                 mov     eax, [eax+28h]
.text:01031F97                 cmp     byte ptr [eax+19h], 1

Das heisst für mich aber, dass ja sicher [[[0x97074] + 0x28] + 0x19] existieren muss. Aber bei mir gibt schon [0x30028] ([[0x97074] + 0x28]) eine Adresse, die nicht weiter verarbeitet werden kann, und dann noch 0x19 dazu zu zählen ändert nichts daran, dass nacher ein Fehler kommt.

Verstehe ich etwas mit diesem 0x1097074 falsch? Muss ich nicht einfach die Imagebasis davon abziehen um die Adresse für ReadProcessMemory zu bekommen?

Ich hoffe mir kann da wer auf die Sprünge helfen!

Gruss
Cromon
 
Zurück