(少なくとも Win32 では) 実行可能ファイルでは、コード セクション (.text) に「読み取り」アクセス ビットと「実行」アクセス ビットが設定されていることに気付きました。コードが自分自身を実行するのではなく、自分自身を読み取る正当な理由はありますか? これが他のセクション (.rdata など) の目的だと思いました。
(具体的には、 について話していIMAGE_SCN_MEM_READ
ます。)
(少なくとも Win32 では) 実行可能ファイルでは、コード セクション (.text) に「読み取り」アクセス ビットと「実行」アクセス ビットが設定されていることに気付きました。コードが自分自身を実行するのではなく、自分自身を読み取る正当な理由はありますか? これが他のセクション (.rdata など) の目的だと思いました。
(具体的には、 について話していIMAGE_SCN_MEM_READ
ます。)
IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ
としてメモリにマップされますPAGE_EXECUTE_READ
。これは PAGE_EXECUTE_WRITECOPY と同等です。これは、コピー オン ライト アクセスを有効にするために必要です。コピー オン ライトとは、ページを変更しようとすると、ページの新しいプロセス プライベート コピーが作成されることを意味します。
書き込みコピーが必要な理由はいくつかあります。
コードを読む理由として私が考えることができる 1 つの例は、自己変更コードを許可することです。自己変更を行うためには、コードは必ずそれ自体を読み取ることができなければなりません。
反対側も考えてみましょう。コードがそれ自体を読み取れないようにすることで、どのような利点が得られますか? これには少し苦労しましたが、そうすることで得られる利点は見られません。