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.