

C言語で、自己改変コードの作成を行っています。
実行時にmain関数の中で、そのコードが含む(main関数ではない)別の関数がロードされているメモリ領域に対して処理を行い、自己改変を実現しようと考えています。
変更を加えたい関数がロードされたメモリ領域を特定し、そのメモリ領域への書き込みをmprotectシステムコールを用いて書き込み可能にするところまではできました。
しかし、その先、そのメモリ領域の内容を読み出し、変更を加えるところがどうもうまくできません。
例えば、あるメモリアドレス0x804845cに格納されている値を読み出したい場合、どのようにしたら良いのでしょうか?
さらに、そこに格納されている値を変更したい場合、memsetシステムコールを用いて書き込みを行おうと考えているのですが、正しいでしょうか?
(例:メモリアドレス0x804845cに値0x23を格納したい場合
memset((0x804845cへのポインタ), 0x23, 1);
のようにする)
アドバイスをお願いいたします。
No.1ベストアンサー
- 回答日時:
この種のポインタ操作はC言語仕様上は保障されませんので可搬性は乏しいですが、あらかじめ該当アドレスへの書き込み権限が設定されているなら、例えば
char *p;
p=0x804845c;
*p=0x23;
で書き込みできるでしょう。
読み出しは、*pを参照すれば可能です。
複数バイトに渡ってアクセスする場合は配列へのポインタとして扱いましょう。書き込みはmemset(これはライブラリ関数で通常システムコールではないですけど)を使っても良いでしょう。
ただし、書き換えたコードを実行する場合はコードがキャッシュされていると書き換え前のコードを実行する可能性もあるので注意が必要です。
コード書き換えを通知する手段(システムコール等)があればそれを使い、またない場合はキャッシュをフラッシュして整合性を取ってください。キャッシュのフラッシュはシステムコールがあるか、なければCPU命令(特権命令)を使うことになります。
Linuxなど保護されたOSではアプリケーションで特権命令を使うことは普通はできません。必要ならデバイスドライバなど特権命令を実行できるカーネルモードで実行されるプログラムを用意してください。
確かに、このようにポインタを利用すれば読み書きできますね。
memsetを使う必要はありませんでした。
コードのキャッシュについては考慮しなくても大丈夫でした。
おかげさまで無事、目的のプログラムが完成いたしました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
allocってなんですか?
-
x64環境で連続4GB以上のメモリ...
-
OpenCV cvLoadImageについて
-
Excelですべての組合せ(重複組...
-
C言語において、 配列要素をひ...
-
C言語 配列の長さの上限
-
CStringからchar*への型変換に...
-
isalpha()関数について
-
配列を使わずに、変数名を動的...
-
C言語の配列のサイズ
-
Integer変数をカラにしたいので...
-
Run-Time Check Failure #3とい...
-
リッチテキストボックスの中身...
-
C# Listを使わずに2次元配列の...
-
define で 配列
-
文字列strの中から文字cを探す...
-
typedefをプログラム中で解除す...
-
c言語プログラミング 等差数列...
-
MSFlexGridのSortメソッドについて
-
「#undef」と「#define」の使い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
c言語のポインタへの文字列入力...
-
HEAP に関すること
-
構造体でchar name[]と*nameの...
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
DLLのマルチスレッドの動作につ...
-
グローバル変数のサイズ
-
C++で、メンバもヒープに確保さ...
-
newしないオブジェクトについて
-
free関数で動作が止まる
-
構造体配列の初期化について
-
void*型のデータサイズ
-
MFCのCStringについて
-
mallocで確保するメモリの領域...
-
CreateFileMapping について
-
LPWSTRのコピー
-
c言語のメモリの確保について
-
配列の添え字の最大数とは?
-
C言語の質問です。 以下の命令...
おすすめ情報