ベースアドレスの衝突の結果としてDllがどのように再配置されるかに関する詳細、および結果

レイモンド

月19日, 2017

ベースアドレスの競合が原因でDLLを再配置する必要がある場合は、イメージが再配置され、再配置されたDLL全体がページファイルによってバックアップさ

説明をより慎重に読むと、ページファイルによってバックアップされるのは、再配置されたDLL全体ではないことがわかります。 より正確には、フィックスアップを含むすべてのページがページファイルに配置されます。 運が良く、フィックスアップのないページがある場合、カーネルはフィックスアップを適用しなかったため、そのページにはコピーオンライトが発生しなかったため、そのページは引き続きファイルシステムイメージによってバックアップされます。

私が意図的にベースアドレスの衝突を引き起こすために見た引数の1つは、再配置されたDLLがページファイルにコピーされるようにすることです。 例えば、ページファイルは、SSDまたは(gasp)RAMドライブ上にあり得る。

そのロジックは、フィックスアップのないページの場合を考慮に入れられません。 これらのページは元のファイルから直接ページインされますが、元のファイルが非常に遅いメディア上にある場合や、CD-ROMドライブやネットワークドライブなど、失われる可能性のあるメディア上にある場合は問題になります。

幸いなことに、DLL全体をページファイルにロードするために、ベースアドレスの競合で面白いゲームをプレイする必要はありません。 代わりに、/SWAPRUNリンカーフラグを使用して、ローダーがイメージをスワップファイルにコピーすることをモジュールヘッダーで指定できます。

Raymond Chen

フォロー

コメントを残す

メールアドレスが公開されることはありません。