ページ 11

プロセスメモリについて教えてください。

Posted: 2008年2月07日(木) 16:48
by ポポロ
初めて投稿させてもらいます。
ここで聞いていいのかわからないですが、プロセスメモリに関して質問させてもらいます。

私自身はプロセスメモリについてはほとんど知りませんので、トンチンカンなことを
言ってるかもしれませんが、ご了承ください。

他の起動しているプログラム(A)のプロセスIDを取得して

OpenProcess()
ReadProcessMemory()

等で特定のアドレスのメモリを読むことは出来るのですが、そのプログラム(A)上で
データが更新されたときにメモリの開放・再確保でアドレスが毎回変わってしまい、
そのデータが保持されているアドレスをまた探さなくてはなりません。
これを避けるためにメモリが開放・再確保されても、すぐその保持されたアドレスを
得るには何か方法あるでしょうか?

よろしくお願いします。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月07日(木) 20:25
by たかぎ
環境ぐらいは書きましょう。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月07日(木) 20:32
by ポポロ
>>環境ぐらいは書きましょう。

環境は

OS: windows XP
開発環境: Visual Studio 2005
開発言語:C言語

です。
環境がわからないと回答しようがないですね。すみません。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月07日(木) 20:47
by たかぎ
アドレスを返す関数を用意すればよいだけでは?

Re:プロセスメモリについて教えてください。

Posted: 2008年2月07日(木) 21:55
by ポポロ
たかぎさん回答ありがとうございます。

>>アドレスを返す関数を用意すればよいだけでは?

アドレスを返す関数を用意するというのはどういうことですか?

プログラム(A)というのは開発しているプログラムではなくて、他の実行されているプログラムです
(例えばExplorer.exeみたいな、他の実行中のアプリケーション)。
このプログラムは逆アセンブリをしないと書き換えできないと思うのですが・・・。
それとも他のアプリケーションが使っているメモリのアドレスを参照している変数のアドレスを返す関数を用意できるということですか?(言い方が変ですが;)
プログラム(A)から今得られているのは、プロセスIDとプロセスメモリとウィンドウハンドルです。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月08日(金) 06:27
by たかぎ
既存のプログラムが相手だと難しいですね。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月08日(金) 09:10
by へろりくしょん
GlobalAlloc()や、HeapAlloc()といったAPIをフックしてみてはどうでしょう。
スタックまでは手が出せませんが、ヒープの再確保ならば追跡可能かと思います。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月08日(金) 13:16
by ポポロ
へろりさん

>>GlobalAlloc()や、HeapAlloc()といったAPIをフックしてみてはどうでしょう。

なるほど、メモリ追跡をしたいアプリケーションはDLLを読み込んでいるので、DLLを仲介にしてAPIをフックすればいけそうですね。ただそうなるとDLLがWindows標準に入っているDLLなので、アプリケーション自体の内容を逆アセンブリして少し書き換えないとですね・・・

早速試してみます。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月09日(土) 07:24
by へろりくしょん
>ただそうなるとDLLがWindows標準に入っているDLLなので、アプリケーション自体の内容を逆アセンブリして少し書き換えないとですね・・・

APIフックをかける実装次第ですが、システムフックを利用すればその必要はありません。
フックプロシージャを持つDLLへ対象となるプロセスがアタッチして来たときに、プロセスのイメージを取得し、
インポートアドレステーブル等からフック対象のAPIのアドレスを書き換えれば可能です。

ただ、システムフックを利用すると相手のアプリケーションがメッセージループを持っていると言うことが
最低限の条件となりますが。

Re:プロセスメモリについて教えてください。

Posted: 2008年2月09日(土) 14:53
by ポポロ
へろりさん、回答ありがとうございます。

>APIフックをかける実装次第ですが、システムフックを利用すればその必要はありません。
>フックプロシージャを持つDLLへ対象となるプロセスがアタッチして来たときに、プロセス
>のイメージを取得し、インポートアドレステーブル等からフック対象のAPIのアドレスを書
>き換えれば可能です。

このようなやり方もあるのですね。まさしく私が求めていた方法です。しかし、ものすごくすば
らしい手法なのですが、肝心の私があまり理解できてない範囲です^^;もう少し勉強してみます。

>ただ、システムフックを利用すると相手のアプリケーションがメッセージループを持っていると
>言うことが最低限の条件となりますが。

メッセージループは持っているのでこの点は大丈夫です。もしこの方法ができれば、毎回プロセス
メモリ上で必要データを探さなくても済みそうですね。
実装できるまで時間がかかりそうですが、がんばってみます。

また問題が出てきたとき、よろしくお願いします。とても勉強になりました。ありがとうございました。