C++ Memory Offsets

11/01/2014 18:31 Hupfi10#1
Hallo Com,


ich habe mir zum Üben eine HackMe.exe (C++ | Console) geschrieben und eine hack.dll zum injecten.

Meine HackMe.exe
Code:
int _tmain(int argc, _TCHAR* argv[])
{

	static int* myptr;
	int Holz = 100;
	myptr = &Holz;
	for (;;){
		cout << "Holz: " << *myptr << "\n";
		cout << "Address: " << *&myptr << "\n";
		Holtz = Holtz + 1;
		getchar(); 
	}
}

Meine hack.dll
Code:
void RewriteValues(){
	HANDLE hd = GetCurrentProcess();
	int *holzpointer = (int *)hd + 0x1F354;
	*holzpointer = 2000;

}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD Reason, LPVOID Reserved){
		switch (Reason){
		case DLL_PROCESS_ATTACH:
			RewriteValues();
			break;
		}
		return TRUE;
	}
Injecte ich nun meine .dll in meine HackMe.exe gibt diese den Geist auf :(
Das Memory Offset in der .dll habe mittels CheatEngine ermittelt, jedoch sind her Fehler nicht ausschließbar.

Würde mich über einige Anregungen sehr freuen.
Danke
11/01/2014 19:33 Jeoni#2
Schau dir mal an, was GetCurrentProcess zurückliefert. Das ist ein Pseudohandle, was als (HANDLE)-1 definiert ist (mehr dazu [Only registered and activated users can see links. Click Here To Register...]). Sollte klar sein, dass du dann irgendeinen Mist versuchst du verändern.
Du meinst vermutlich die Adresse des Hauptmoduls im Prozess, welche du mit GetModuleHandle(nullptr) bekommst.
Abgesehen davon ist hier aufgrund der Pointerarithmetik ein fehler drin:
Code:
int *holzpointer = (int *)hd + 0x1F354;
Erst wird hd in einen int* gecastet und dann wird was draufaddiert. Was dann in holzpointer steht, lässt sich mathematisch (ohne Pointerarithmetik oder Typen) so ausdrücken: holzpointer = hd + 0x1F354 * sizeof(int)
Zum rechnen solltest du also einen integralen Typ ausreichender Größe (bspw. uintptr_t) oder einen Pointertyp, dessen Basistyp nur 1 byte groß ist (bspw. uint8_t*).
Insgesamt könnte man also deine RewriteValues funktion korrekterweise so (oder nach belieben auch in mehr als einer Zeile) schreiben:
Code:
*((int*)((uintptr_t)GetModuleHandle(nullptr) + 0x1F354)) = 2000;
Ob das Offset von 0x1F354 korrekt ist, kann ich dabei natürlich auch nicht sagen, da musste ich mich jetzt auf deine Angaben verlassen.
Ich hoffe, dass das hilft ;)
Jeoni
11/02/2014 15:00 Hupfi10#3
Danke erstmal an Jeoni,


der Fehler bestand zum einen in dem genanntem Punkt rund um GetModuleHandle statt GetCurrentProcess :|
Die Pointer Arithmetik um den Integer Pointer war ebenfalls ein Knackpunkt.
Mein logischer Fehler bestand jedoch darin, dass die DLL das Offset des statischen Pointers, der wiederum auf die Adresse von Holz in meiner HackMe.exe zeigt beinhaltet und man deshalb doppelt dereferenzieren muss. In Code ausgedrückt sieht das wie folgt aus:
Code:
void RewriteValues(){
	uintptr_t lePointer = (uintptr_t)GetModuleHandle(nullptr) + 0x1F354;
	int* myPtr = *(int **)lePointer;
	*myPtr = 2000;
}