2012-06-10 11 views
5

Ich habe eine DLL disassembliert und sehe dort einige Funktionen. Ich habe die Funktion gefunden, die ich brauche, und die Adresse lautet 0x10001340.ist es möglich, dass sich die Funktionsadresse in der DLL ändert, wenn sie in die Anwendung geladen wurde?

Würde diese Adresse gleich bleiben, wenn ich diese DLL in meine Anwendung lade? Wäre es möglich, diese Funktion über die Adresse meiner Anwendung aufzurufen?

Ich frage, weil ich nicht sicher bin: Was passiert, wenn diese DLL geladen wird, haben einige Funktionen in der Hauptanwendung bereits die gleiche Adresse? Also vielleicht die Funktionen innerhalb einer DLL können Adressen beim Laden oder etc. ändern

+0

Sie haben es richtig ... –

+0

richtig über welche Option? : D-Adresse kann sich ändern, wenn geladen? – Kosmos

Antwort

8

Auf Windows dlls haben eine bevorzugte Ladeadresse, aber der Lader ist in der Lage, alle diese Referenzen ändern, wenn es bemerkt, dass solcher Teil des virtuellen Adressraum ist schon benutzt. Dieser Prozess wird "Rebasing" genannt.

Die "Standard" -Basisadresse wird zum Zeitpunkt der Verknüpfung angegeben (/BASE mit dem Microsoft-Linker), und es kann nützlich sein, es auf etwas anderes als die Standardeinstellung festzulegen, wenn Sie die DLL neben einem anderen mit dem verwenden möchten gleiche Basisadresse; dies beschleunigt den Ladeprozess, da der Lader nicht bei jeder Ladung eine der DLLs neu erstellen muss. (IIRC gibt es auch Werkzeuge, die in der Lage sind, eine existierende DLL zu rebasen und das Ergebnis auf Platte zu speichern)

Es ist gut zu bedenken, dass ab Windows Vista dlls, die mit einem bestimmten Flag kompiliert wurden, immer zufällig geladen werden Basisadresse, um eine Art von Exploits zu vermeiden.

3

Es ist extrem unwahrscheinlich, dass Sie am Ende mit der gleichen Adresse enden werden. Das Standard/BASE-Argument für den Linker für DLLs ist 0x10000000, so ist Ihr Einstiegspunkt an dieser Adresse gelandet. Aber es gibt viele DLLs, die mit der Standardeinstellung verknüpft sind, nur eine kann tatsächlich an dieser Adresse geladen werden. Alle anderen, die später geladen werden, müssen neu aufgebaut werden.

Sie könnten einen besseren Wert für/BASE finden, es ist jedoch nie eine Garantie, dass Sie die angeforderte Ladeadresse erhalten.

2

Wie Matteo sagte, hat eine DLL eine bevorzugte Ladeadresse (angegeben im ImageBase-Feld der IMAGE_OPTIONAL_HEADER Struktur). Wenn das System versucht, eine DLL zu laden, wird sie, wenn möglich, unter dieser Adresse geladen (sofern die Adressraum-Randomisierung nicht aktiviert ist) und kein "Patchen" erforderlich ist. Wenn es nicht an der bevorzugten Adresse geladen werden kann, wird die DLL verlagert, was erfordert, dass absolute Verweise in der DLL gepatcht werden, um die Verschiebung auszugleichen.

So, um Ihre Frage zu beantworten: Es gibt keine Garantie, dass eine DLL an seiner bevorzugten Adresse geladen wird. Nach dem Laden laden nachfolgende Ladevorgänge nicht mehr Kopien der DLL, so dass sich die Adressen nicht ändern. Nach dem Entladen (DLLs werden als Referenz gezählt) gibt es jedoch keine Garantie, dass es beim nächsten Mal an die gleiche Adresse geladen wird.