4

Es gibt "First Thunk" (FT), das der Loader nach der Ausführung mit korrekten Adressen überschreibt.Warum PE braucht Original First Thunk (OFT)?

Aber wenn PE OFT verwendet?

Benötigt PE es sogar?

+1

Dies ist gut beschrieben von [Matt Pietrek's alten Artikel] (https://msdn.microsoft.com/en-us/library/ms809762.aspx). Lasst es uns nicht alle wiederholen, Matts Artikel ist das Kanonische. –

Antwort

6

Der ursprüngliche erste Thunk wird benötigt, wenn die Importe gebunden sind, die importierte .DLL jedoch nicht übereinstimmt.

Auf einer neuen ungepatchten Version von Windows sind alle Adressen aller Funktionen in der Basis .DLLs (ntdll, kernel32, user32 usw.) bekannt. Nehmen wir Shell32 zum Beispiel, es verbindet sich mit kernel32!CreateProcess und die wahre Adresse CreateProcess kann direkt in Shell32 gespeichert werden. Dies nennt man import binding und lässt den Lader den Schritt überspringen, in dem er alle Adressen der importierten Funktionen nachschlägt.

Dies funktioniert nicht, wenn die importierte .DLL nicht an ihrer bevorzugten Adresse geladen wurde oder wenn sich die .DLL geändert hat (Sicherheitsupdate usw.). Wenn dies geschieht, muss der Lader die Funktionen "den normalen Weg" nachschlagen, und das ursprüngliche erste Thunk-Array muss verwendet werden, da nur dort die RVA s der Funktionsnamen gespeichert sind.

Wenn die Importbindung nicht verwendet wird, ist das ursprüngliche erste Thunk-Array optional und möglicherweise nicht vorhanden.

ASLR hat wahrscheinlich diese Optimierung irrelevant gemacht.