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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ポポロ

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

#1

投稿記事 by ポポロ » 17年前

初めて投稿させてもらいます。
ここで聞いていいのかわからないですが、プロセスメモリに関して質問させてもらいます。

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

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

OpenProcess()
ReadProcessMemory()

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

よろしくお願いします。

たかぎ

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

#2

投稿記事 by たかぎ » 17年前

環境ぐらいは書きましょう。

ポポロ

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

#3

投稿記事 by ポポロ » 17年前

>>環境ぐらいは書きましょう。

環境は

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

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

たかぎ

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

#4

投稿記事 by たかぎ » 17年前

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

ポポロ

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

#5

投稿記事 by ポポロ » 17年前

たかぎさん回答ありがとうございます。

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

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

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

たかぎ

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

#6

投稿記事 by たかぎ » 17年前

既存のプログラムが相手だと難しいですね。

へろりくしょん

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

#7

投稿記事 by へろりくしょん » 17年前

GlobalAlloc()や、HeapAlloc()といったAPIをフックしてみてはどうでしょう。
スタックまでは手が出せませんが、ヒープの再確保ならば追跡可能かと思います。

ポポロ

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

#8

投稿記事 by ポポロ » 17年前

へろりさん

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

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

早速試してみます。

へろりくしょん

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

#9

投稿記事 by へろりくしょん » 17年前

>ただそうなるとDLLがWindows標準に入っているDLLなので、アプリケーション自体の内容を逆アセンブリして少し書き換えないとですね・・・

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

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

ポポロ

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

#10

投稿記事 by ポポロ » 17年前

へろりさん、回答ありがとうございます。

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

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る