exe 内のすべての要素がイメージのベースからの相対オフセットにあるのに、なぜ再配置テーブルが必要なのですか?? つまり、画像がたとえば 0X60000 の正のオフセットによって置き換えられたとしても、新しいベースに相対的な RVA を使用するので、なぜ再配置テーブルがあるのでしょうか??
2 に答える
ポイントは、コードが RVA または whats-or-ever を介してグローバル (グローバル変数と関数アドレス) にアクセスしないことです。それらは絶対アドレスでアクセスされます。また、実行可能ファイルが優先アドレスにロードされなかった場合に備えて、このアドレスを変更する必要があります。
再配置テーブルは、まさにそれらの場所で構成されています。これは、実際のベース アドレスと優先アドレスの差によって調整する必要があるすべての場所のテーブルです。
ところで、DLL とは対照的に、EXE には通常、再配置テーブルが含まれていません。これは、それらがアドレス空間にマップされる最初のモジュールであるためです。したがって、常に優先アドレスにロードされる可能性があります。通常再配置テーブルを含む DLL の場合は状況が異なります。
PS Windows 7 EXE では、ランダムなアドレスでロードされる場合に備えて、EXE に再配置テーブルが含まれる場合があります。それはセキュリティ機能です(哀れな私見)
編集:
関数アドレスは常に絶対値でアクセスされるとは限らないことに注意してください。x86 では、分岐命令 ( jmp
、call
など) には、相対オフセットで機能する「短い」形式があります。そのような場所は、再配置表に記載する必要はありません。
EXE ファイルの場合、実行可能イメージは常に優先アドレスにロードされるため、再配置テーブルは必要ありません。再配置テーブルは安全に削除できます。