- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:指定したメモリアドレスの値の読み出し(自己改変コードの作成))
C言語で自己改変コードの作成におけるメモリアドレスの値の読み出しと変更方法
このQ&Aのポイント
- C言語で自己改変コードを作成する際、特定のメモリアドレスの値を読み出す方法はありますか?
- また、そのメモリアドレスの値を変更する場合、memsetシステムコールを使用すればよいでしょうか?
- アドバイスをお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
この種のポインタ操作はC言語仕様上は保障されませんので可搬性は乏しいですが、あらかじめ該当アドレスへの書き込み権限が設定されているなら、例えば char *p; p=0x804845c; *p=0x23; で書き込みできるでしょう。 読み出しは、*pを参照すれば可能です。 複数バイトに渡ってアクセスする場合は配列へのポインタとして扱いましょう。書き込みはmemset(これはライブラリ関数で通常システムコールではないですけど)を使っても良いでしょう。 ただし、書き換えたコードを実行する場合はコードがキャッシュされていると書き換え前のコードを実行する可能性もあるので注意が必要です。 コード書き換えを通知する手段(システムコール等)があればそれを使い、またない場合はキャッシュをフラッシュして整合性を取ってください。キャッシュのフラッシュはシステムコールがあるか、なければCPU命令(特権命令)を使うことになります。 Linuxなど保護されたOSではアプリケーションで特権命令を使うことは普通はできません。必要ならデバイスドライバなど特権命令を実行できるカーネルモードで実行されるプログラムを用意してください。
お礼
確かに、このようにポインタを利用すれば読み書きできますね。 memsetを使う必要はありませんでした。 コードのキャッシュについては考慮しなくても大丈夫でした。 おかげさまで無事、目的のプログラムが完成いたしました。 ありがとうございました。