Ein feines Detail darüber, wie DLLs als Ergebnis einer Basisadressenkollision verschoben werden, und Konsequenzen

Raymond

19. Januar, 2017

Wenn eine DLL aufgrund eines Basisadressenkonflikts verschoben werden muss, wird das Image verschoben, und die gesamte verlagerte DLL wird jetzt von der Auslagerungsdatei unterstützt.

Wenn Sie die Beschreibung genauer lesen, werden Sie feststellen, dass nicht genau die gesamte verlagerte DLL von der Auslagerungsdatei unterstützt wird. Genauer gesagt werden alle Seiten, die Korrekturen enthielten, in die Auslagerungsdatei eingefügt. Wenn Sie Glück haben und eine Seite ohne Korrekturen haben, wird diese Seite immer noch aus dem Image ausgelagert, da der Kernel keine Korrekturen darauf angewendet hat und daher keine Copy-on-Write für diese Seite, sodass sie weiterhin vom Dateisystem-Image unterstützt wird.

Eines der Argumente, die ich gesehen habe, um absichtlich eine Basisadressenkollision zu verursachen, ist, dass die verlagerte DLL in die Auslagerungsdatei kopiert wird, was ein Gewinn ist, wenn sich die Auslagerungsdatei auf einem schnelleren Medium befindet als die DLL. Beispielsweise kann sich die Auslagerungsdatei auf einer SSD oder (keuchend) einem RAM-Laufwerk befinden.

Diese Logik berücksichtigt den Fall von Seiten ohne Korrekturen nicht. Dies kann ein Problem sein, wenn sich die Originaldatei auf einem sehr langsamen Medium befindet oder auf einem Medium, das verloren gehen könnte, z. B. einem CD-ROM-Laufwerk oder einem Netzlaufwerk.

Glücklicherweise müssen Sie keine lustigen Spiele mit Basisadressenkonflikten spielen, um Ihre gesamte DLL in die Auslagerungsdatei zu laden. Verwenden Sie stattdessen das Linkerflag /SWAPRUN, mit dem Sie im Modulheader angeben können, dass der Loader das Image in die Auslagerungsdatei kopieren soll.

Raymond Chen

Folgen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.