Frage zu Cheat Engine

09/12/2011 16:03 .Infinite#1
Ich bekomme beim Pointerscan in CheatEngine immer Ergebnisse die folgendermaßen aussehen:
Code:
"anwendung.exe"+0x12345678
Wofür steht nun der Name des Programms? bzw. wie kann ich das in c++ in mein Programm einbinden?
09/12/2011 16:30 .BritainAndy#2
Ich kann jetzt nur von Metin2 Reden, dort ist das auch "metin2client.exe"+0x12345.. Die Modulebase von Metin2 liegt bei 400000 und wenn man jetzt z.B. den Playerpointer herausfinden will muss mann 400000+0x12345 rechnen.
09/12/2011 16:36 .Infinite#3
Macht die Base denn überhaupt einen Unterschied, wenn ich das ganze als dll injecte?
Eigentlich wird die dann doch in den selben Speicherbereich geladen...
09/12/2011 17:36 Bot_interesierter#4
Die Basisadresse des Moduls kann von 400000 Abweichen, wenn ASLR Aktiv ist.

Dabei wird die Basis Adresse randomisiert, damit können viele Angriffe über Schwachstellen in Programmen verhindert werden, Beispielsweise funktioniert dann eine klassische Return-to-libc-Attacke nicht, da die Adressen der Libc-Funktionen zur Laufzeit bestimmt werden müssten.

Wenn du eine Dll in den Prozess injizierst kannst du die Basisadresse sehr leicht herausfinden, das Handle welches von GetModuleHandle zurück gegeben wird ist equivalent zur Basis Adresse des jeweiligen Moduls.

So ähnlich könnte das dann im Code der DLL aussehen:
Code:
sometype* thing = reinterpret_cast<sometype*>(GetModuleHandle(L"anwendung.exe")+OFFSET_CONSTANT);
if(thing==OFFSET_CONSTANT) // Wenn GetModuleHandle 0 zurück gibt liegt ein Fehler vor
 throw(GetLastError()); //wirft den Fehlercode als Exception, wird sie nicht gefangen beendet sich das Programm. 
thing->mSomething = CHEAT_CONSTANT;
Das ist jetzt natürlich nur ein Beispiel und es kann bei dir ganz anders aussehen, ich bin eben davon ausgegangen das dein Zeiger auf irgendeine Struktur zeigt und dass du dafür einen Strukturtypen "sometype" definiert hast.

Edit:
Natürlich ist die Exception so wie oben eher Suboptimal, dass ist nur ein minimales Beispiel und soll veranschaulichen wie Fehlerbehandlung aussehen kann, wichtig ist dass die Fehlerbehandlung im Projekt einheitlich gestaltet ist.
Meistens benützt man Exception Objekte denen man zusätzliche Information beilegt, so kann man leichter Nachvollziehen wo ein Fehler aufgetreten ist und wie dieser zu behandeln ist.
Es gibt ja durchaus Situationen in denen eine Windows API Fehlschlägt, man aber deswegen nicht das ganze Programm abbrechen will.
09/12/2011 17:55 .Infinite#5
Danke! Mein Frage wäre damit dann beantwortet :)
09/25/2011 18:49 MrSm!th#6
#closed