C ++ So steuern Sie die Image Base der LoadLibrary-API
-
28-10-2019 - |
Frage
Nach dem erneuten Basieren des Hauptprogramms ganz oben in seiner eigenen Imagebasis.
Wie garantiere ich, dass die geladene DLL in 0x400000 geladen wird?
dllImageBase = LoadLibrary("test.dll");
printf("imagebase = 0x%x", dllImageBase);
Ich bekomme immer 0x460000 anstelle von 0x400000
Ich benötige meine erste DLL-Anweisung, um bei 0x401000 zu beginnen. Sie begann bei 0x600000, bevor sie neu basiert
Befehl für Linker zum erneuten Basieren ist
#pragma comment( linker, "/BASE:8000000")
0x400000 ist derzeit also kostenlos, wird jedoch nicht standardmäßig verwendet. Auf jede Art und Weise kann ich es steuern, wo es sich verschieben soll.Einige WIN32API vielleicht?
Lösung
Sie müssen die Adressraum-Layout-Randomisierung deaktivieren, damit die DLL an der gewünschten Stelle geladen wird.Eine Funktion, die Sie davon abhält, was Sie tun möchten./ DYNAMICBASE Linker Option.Das Laden bei 0x400000 hat funktioniert, als ich es ausprobiert habe.
Andere Tipps
Verlassen Sie sich niemals auf das Laden einer DLL an einer bestimmten Basis.Wenn Sie das Laden von DLLs an einer bestimmten Basis erzwingen könnten, öffnen Sie eine potenzielle Sicherheitslücke.
Wenn Sie eine Kartendatei haben, wissen Sie, wie hoch der Versatz einer bestimmten Funktion ist.Daher können Sie GetProcAddress verwenden, um die Basisadresse der DLL zu ermitteln.Dies ist eine weitaus sicherere Arbeitsweise, selbst wenn das Aktualisieren Ihrer DLL den Code zum Laden der DLL beschädigt.