C言語関係掲示板

過去ログ

No.1267 他プロセスのメモリ内容監視

[戻る] [ホームページ]
No.16749

他プロセスのメモリ内容監視
投稿者---ebi(2004/09/10 10:50:56)


皆さん、はじめまして。

Windows OSやWin32 APIに限りなく近い質問のような気がして恐縮なんですが・・・。

Windows上で実行中のあるプログラムが使用している仮想アドレス空間(特にヒープ)を監視するモニタープログラムを書けないものかと考えています。

監視対象のプログラムはモニターのことを何も知らないので、そちらに手を入れることは一切できないという前提で、どのような手段が考えられるかアイディアをお聞かせ願えないでしょうか。

自分では、エミュレータっぽくモニター内で監視対象プログラムを動かすくらいしか思いつかないのですが、幅広く可能性を検討してみたいので、多くのご意見をいただければと思います。

どうぞよろしくお願いします。


No.16750

Re:他プロセスのメモリ内容監視
投稿者---シャノン(2004/09/10 11:08:26)


>Windows上で実行中のあるプログラムが使用している仮想アドレス空間(特にヒープ)を監視するモニタープログラムを書けないものかと考えています。
>
>監視対象のプログラムはモニターのことを何も知らないので、そちらに手を入れることは一切できないという前提で、どのような手段が考えられるかアイディアをお聞かせ願えないでしょうか。

監視ってのはどういうことを意図していますか?
他のプロセスのメモリを覗き見るだけなら、ReadProcessMemory という関数で可能です。
その変更を検出したいということになると…

1. タイマーなどで定期的に ReadProcessMemory する
2. ブレイクポイントを使う

かな、と思います。
ブレイクポイントにしても、ハードウェアとソフトウェアの2通りがあります。

ハードウェアブレイクポイントは、CPU の機能を使ったものです。
SetThreadContext という API を使って、特定のアドレスの内容が変更されたら例外が発生するように仕掛けます。

ソフトウェアブレイクポイントは、対象アドレスを含むメモリ領域を書込み禁止属性に設定し、プログラムがそこに書き込もうとしたときに発生するアクセス違反例外を捕らえる、という手法が考えられます。


No.16751

Re:他プロセスのメモリ内容監視
投稿者---シャノン(2004/09/10 11:18:12)


>ソフトウェアブレイクポイントは、対象アドレスを含むメモリ領域を書込み禁止属性に設定し、プログラムがそこに書き込もうとしたときに発生するアクセス違反例外を捕らえる、という手法が考えられます。

デマ言っちゃったかな…?
これは一般には「ソフトウェア・ブレイクポイント」とは呼ばないかもしれません。
俺も最近仕入れたにわか知識なので…
どなたか詳しい方、「ソフトウェア・ブレイクポイント」って一般的にはどういうものなのか教えていただけないでしょうか。

#x86 プロセッサ限定のお話になります。


No.16752

Re:他プロセスのメモリ内容監視
投稿者---シャノン(2004/09/10 11:27:26)


>>ソフトウェアブレイクポイントは、対象アドレスを含むメモリ領域を書込み禁止属性に設定し、プログラムがそこに書き込もうとしたときに発生するアクセス違反例外を捕らえる、という手法が考えられます。
>
>デマ言っちゃったかな…?
>これは一般には「ソフトウェア・ブレイクポイント」とは呼ばないかもしれません。
>俺も最近仕入れたにわか知識なので…
>どなたか詳しい方、「ソフトウェア・ブレイクポイント」って一般的にはどういうものなのか教えていただけないでしょうか。
>
>#x86 プロセッサ限定のお話になります。

無駄レスしてごめん。
ソフトウェア・ブレイクポイントってのは、INT 3h のことですかね?
だとすると、

ebi さん>
INT 3h ってのは、プログラムの実行が特定のところまで進んだ時に止める CPU 命令で、いわゆる VC++ などで最も一般的に使われるブレイクポイントのことです(ハードウェア・ブレイクポイントでも同じことはできますが)。
これではメモリの変更は検出できませんね…


No.16757

Re:他プロセスのメモリ内容監視
投稿者---ebi(2004/09/10 13:33:00)


シャノンさん、お返事どうもありがとうございます。

>監視ってのはどういうことを意図していますか?
>他のプロセスのメモリを覗き見るだけなら、ReadProcessMemory という関数で可能です。

あ、それで事足りちゃいそう・・・。

>その変更を検出したいということになると…
>
>1. タイマーなどで定期的に ReadProcessMemory する
>2. ブレイクポイントを使う
>
>かな、と思います。

やはり最終的にはどのように変更されたのかを知りたいのですが、監視対象のプログラムに与える影響(動作だけでなくパフォーマンス的にも)を極力少なくしたいので、定期的にスナップショットを取得できればよいと思っています。

それにしてもUNIX屋の私にとっては、とても勉強になりました。
本当にどうもありがとうございました。

ebi


No.16759

Re:他プロセスのメモリ内容監視
投稿者---シャノン(2004/09/10 14:20:00)


もうひとつ思い出した。

GetWriteWatch という関数の説明を見ると、
メモリの変更を追跡できるようなことが書いてあります。

ただし、Win98 でしか使えないマイナー関数なので、使ったことはありません。