4

"First Thunk"(FT)があり、実行後に正しいアドレスで上書きされます。PEにはオリジナルファーストサンク(OFT)が必要なのはなぜですか?

しかし、PEでOFTを使用する場合は、

PEにも必要ですか?

+1

これは[Matt Pietrekの前の古い記事](https://msdn.microsoft.com/en-us/library/ms809762.aspx)でよく説明されています。すべてをここで繰り返すわけではありませんが、Mattの記事は標準です。 –

答えて

6

インポートがバインドされているがインポートされた.DLLが一致しない場合は、最初のサンクが必要です。

新しいパッチが適用されていないバージョンのWindowsでは、ベース.DLL(ntdll、kernel32、user32など)のすべての関数のすべてのアドレスがわかります。例えばshell32を取るとkernel32!CreateProcessにリンクし、真のアドレスCreateProcessを直接shell32に格納することができます。これはimport bindingと呼ばれ、ローダーはインポートされた関数のすべてのアドレスを検索するステップをスキップできます。

インポートされた.DLLが優先アドレスでロードされていないか、.DLLが変更されている(セキュリティアップデートなど)場合、これは機能しません。この場合、ローダは関数を "通常の方法"で検索しなければならず、元の最初のサンク配列は関数名のRVAが格納されている唯一の場所であるため、使用する必要があります。

インポートバインディングが使用されていない場合、元の最初のサンク配列はオプションであり、存在しない可能性があります。

ASLRはおそらくこの最適化を無関係にしました。

関連する問題