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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top