2

(少なくとも Win32 では) 実行可能ファイルでは、コード セクション (.text) に「読み取り」アクセス ビットと「実行」アクセス ビットが設定されていることに気付きました。コードが自分自身を実行するのではなく、自分自身を読み取る正当な理由はありますか? これが他のセクション (.rdata など) の目的だと思いました。

(具体的には、 について話していIMAGE_SCN_MEM_READます。)

4

3 に答える 3

5

IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READとしてメモリにマップされますPAGE_EXECUTE_READ。これは PAGE_EXECUTE_WRITECOPY と同等です。これは、コピー オン ライト アクセスを有効にするために必要です。コピー オン ライトとは、ページを変更しようとすると、ページの新しいプロセス プライベート コピーが作成されることを意味します。

書き込みコピーが必要な理由はいくつかあります。

  • ローダーによる再配置が必要なコードには、ローダーが修正を行えるように、このセットが必要です。これは非常に一般的です。
  • コードとデータが 1 つのセクションにあるセクションでも、プロセス グローバルを変更できるようにするために、これが必要になります。コードとデータを 1 つのセクションに配置すると、スペースを節約でき、コードとコードが使用するグローバルを同じページに配置することで局所性を向上させることができます。
  • 自分自身を変更しようとするコード。これはかなり珍しいと思います。
于 2009-04-26T20:35:25.397 に答える
0

コードを読む理由として私が考えることができる 1 つの例は、自己変更コードを許可することです。自己変更を行うためには、コードは必ずそれ自体を読み取ることができなければなりません。

反対側も考えてみましょう。コードがそれ自体を読み取れないようにすることで、どのような利点が得られますか? これには少し苦労しましたが、そうすることで得られる利点は見られません。

于 2009-04-26T20:43:08.280 に答える