2


0

"execute"および "read"とマークされた実行可能セクション

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

(具体的には、http://elfz.laacz.lv/ms_exe_spec.html#L41 [+ IMAGE_SCN_MEM_READ +]について話している。)

3 Answer


5


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

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

  • ローダーによって再配置する必要があるコードには、このセットが必要です。 ローダーが修正できること。 これは非常に一般的です。

  • 単一のセクションにコードとデータがあるセクションには、これが必要です。 まあ、プロセスのグローバルを変更できるようにするため。 コード

  • 自分自身を変更しようとするコード。 これはかなりまれだと思います。


1


特にlong longまたはdouble値に対するコンパイル時定数は、多くの場合、コードセグメントからのmovレジスタ_address_ステートメントでロードされます。


0


私がコードを読む理由のために考えることができる1つの例は自己修正コードを可能にすることです。 自己修正するためには、コードは必ず自分自身を読み取ることができなければなりません。

反対側も考えてください。 コードが自分自身を読み取らないようにすることで、どのような利点が得られますか? 私はこれに少し苦労しましたが、そうすることから得られる利点はないと思います。