0

プロセスで dll をロードすると、その dll はインポートする関数のアドレスをどのように解決しますか? GetProcAddress と LdrGetProcedureAddress にブレークポイントを設定しようとしましたが、そこで壊れません。

誰か説明してください。

4

1 に答える 1

3

DLL がロードされると、DLL がロードされるベース アドレスを反映する必要がある場合、ローダーはすべてのアドレスを更新します。

http://msdn.microsoft.com/en-us/magazine/bb985014.aspx :

DLL を作成するとき、リンカは DLL が特定のアドレスにロードされると想定します。コードとデータの特定の部分には、DLL が優先アドレスにロードされた場合にのみ正しいハードコーディングされたアドレスが含まれています。ただし、実行時に、オペレーティング システムが別のメモリ位置に DLL をロードする必要がある可能性があります。

OS が DLL を移動しなければならない状況を処理するために、リンカはベースの再配置を DLL に追加します。ベース再配置は、DLL がメモリにロードされた場所の正しいアドレスが含まれるように変更が必要なアドレスです。DLL のベース再配置が多いほど、OS がそれらを処理して DLL をロードするために必要な時間が長くなります。適切なベースの DLL は優先アドレスにロードされ、ベース再配置レコードの処理をスキップできます。

最近では、セキュリティ対策として DLL のベース アドレスがランダム化されることがより一般的になっています。上記の記事はそれ以前のものです。以下も参照してください。

移転(ウィキペディア)

ポータブル実行可能ファイル (ウィキペディア)

于 2012-05-21T01:06:21.607 に答える