• 締切済み

指定した実行中プロセスの、指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか?

 指定した実行中プロセスの指定したメモリアドレスの値を読み取るにはどうしたらよいのでしょうか。  例えば(あくまで例えば)グーグルアースの実行中、現在センターに来ている座標をVBで取得したい場合などです。その座標が格納されているメモリアドレスはわかっているのですが、VBからそこへの手の出し方が判らないのです。 できれば一定時間ごとにその値を取得して表示したいと思っているのですが、VBからプロセスを指定したりそのメモリの値を見るなんて方法がさっぱり判らなくて困っています。

みんなの回答

noname#118114
noname#118114
回答No.1

サンプルを紹介したいところですが字数制限を越えてしまうのでAPIのみ紹介しておきます。 プロセスを列挙するAPI Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long プロセスを開くAPI Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long プロセスを閉じるAPI Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long メモリを読込むAPI Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Object, ByVal nSize As Integer, ByVal lpNumberOfBytesRead As Integer) As Integer これらを元に探せば必ず見つかりますので、後は自分にとって一番わかりやすいのを探して下さい。 一定時間毎に取得したい場合はタイマを使って取得します。 プロセスは一度画面を閉じない限り変らないので、1回取得するだけで良いです。

nishihi
質問者

補足

回答ありがとうございます。なかなか解答がつかなくて本当に困っているところでした。 Dim ps As System.Diagnostics.Process()=System.Diagnostics.Process.GetProcessesByName("プロセス名") という文、そこから Dim p As System.Diagnostics.Process For Each p In ps によって、目的のプロセスのハンドルを掴むことには成功したようです。 p.Handleの中身を見てみたところ、毎回違う、数桁の数字が入っていました。コレが私の狙っているプロセスの、その時のハンドルだと思います。 lpBaseAddress については、メモリエディタで探したメモリアドレス位置、[AB8B18]を数字に変換した値、[11242264]を直接入れました。nSize は、私が欲しい値はAB8B18から数えて4バイト分なので、[4]を直接入力しました。 問題はここからでした。lpBaseAddress とlpNumberOfBytesRead に何を入れたら良いのか判らないんです。 その二つの引数がポインタだということは判りました。ポインタというのはAB8B18のようなモノのことですよね? その値を取得し、設定するために、VarPtr()を使おうとしたら、私のVB.NETではVB6と違い、この関数がもう使えないことがわかりました。 ここでいったん大きく詰まってしまいました。 今の私のソースは、 Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Object, ByVal lpBaseAddress As Integer, ByVal lpBuffer As Object, ByVal nSize As Integer, ByVal lpNumberOfBytesRead As Integer) As Integer ReadProcessMemory(p.Handle, 11242264, VarPtr(memContent), 4, VarPtr(intLength)) こういう状態です。VarPtrが下線がついて、エラーを示しています。 このアプローチで正しいのでしょうか? 何とか他の打開策を模索しているところで System.Runtime.InteropServices.Marshal.StructureToPtrメソッド というものが今日見つかりました。 ただこれはまだ私にはまったく判らないモノでして一体これをどう使えば目的の値を取得できるのか、までは調べが至っていない状態です。

関連するQ&A

  • VBのメモリのアドレス取得

    C++で作成したDLLをVBから変数を渡して 文字列が格納されているメモリアドレスを取得して、 別のDLLにメモリアドレスを渡したいのですが、 具体的な指定の仕方を教えてください。

  • プロセスが実行中かどうか調べる方法

    CreateProcessで作ったプロセスが実行中かどうか調べる方法はありませんか。 標準出力に値を吐き出し続けるコンソールアプリケーションから、値を取得して処理をしたいのですが、CreateProcessでつくってパイプで処理しようとしています。ぐぐったところWaitForSingleObjectで待つようなサンプルは見つかったのですが、呼び出したプロセスが終了しないのでこれは使えないので 実行中はずっとループし続けるような感じにしたいのですが。 よろしくお願いします

  • 指定したメモリアドレスの値の読み出し(自己改変コードの作成)

    C言語で、自己改変コードの作成を行っています。 実行時にmain関数の中で、そのコードが含む(main関数ではない)別の関数がロードされているメモリ領域に対して処理を行い、自己改変を実現しようと考えています。 変更を加えたい関数がロードされたメモリ領域を特定し、そのメモリ領域への書き込みをmprotectシステムコールを用いて書き込み可能にするところまではできました。 しかし、その先、そのメモリ領域の内容を読み出し、変更を加えるところがどうもうまくできません。 例えば、あるメモリアドレス0x804845cに格納されている値を読み出したい場合、どのようにしたら良いのでしょうか? さらに、そこに格納されている値を変更したい場合、memsetシステムコールを用いて書き込みを行おうと考えているのですが、正しいでしょうか? (例:メモリアドレス0x804845cに値0x23を格納したい場合 memset((0x804845cへのポインタ), 0x23, 1); のようにする) アドバイスをお願いいたします。

  • メモリをアドレスを直接指定して値を取得するには

    マイコンのプログラムを書いております。 やりたい事はC言語でフラッシュメモリの物理アドレスを直接指定してそのアドレスの値を1バイト読むことです。例えば0xF000番地のアドレスから1バイト読む場合、以下のソースコードで問題ありますでしょうか?なおアドレスは2バイトで表現されます。 unsigned char *p_value; unsigned char value; p_value=&value; p_value=0xF000; この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか? よろしくお願いします。

  • メモリのアドレスからの値の取得のしかた

    c言語でメモリのアドレスから値を取得するには、どういうプログラムにしたらいいですか? 例えば、0x1f00から0x2000までの値を取得するには、具体的にどうプログラムしますか?

  • Windows batで指定した行のみ値を取得

    Windows batで指定した行のみ値を取得したいのですが、うまく取得できません。 <CSVデータの内容> 0002 10,11,19,12,15,1192 ,0,00 10,11,20,17,30,1192 ,1,00 <実行bat> REM データ取得 FOR /F "tokens=7-9 delims=," %%i in (dakoku_data.csv) DO SET C=%%i%%j これを実行すると、 C = 000 C = 100 となってしまい、最終行の値だけが格納されてしまうので、 指定した行の値だけ、取得するには、どうしたらよいでしょうか?

  • DataGridViewで指定したセルの値を取得

    こんにちは。 VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。 どなたか教えてください。

  • exe実行後、プロセスが残ってしまう

    VB初心者(初日)です。 よろしくお願いします。 あるアプリケーションで「アプリケーションの連動」 の設定があります。 私はperlをキックしてほしいのですが、 VBのexeしか指定できません。 なので、VBのexeを作ることにしました。 ただperlをキックしたいだけのexeです。 Private Sub Form_Load() Ret = Shell("E:\Perl\bin\perl.exe G:\InetPub\wwwroot\cgi-bin\test.cgi", vbAbort) End Sub うまくキックしてくれるのですが、タスクマネージャーで 確認すると、プロセスが残ってしまいます。 shell実行後、完全に終了するにはどうしたらよいですか?

  • 他のコンピュータのプロセスを取得

    VB2005Expressにて開発しています。 他のコンピュータで実行中のプロセスを取得したいと思っています。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses("プロセス名","192.168.XXX.XXX") で指定したコンピュータからプロセスは取得することは出来ました。 ただ、特定のコンピュータだけ「リモート コンピュータに接続できませんでした。」というエラーが出てしまいます。 プログラムの実行環境のID、パスワードと特定のコンピュータの IDとパスワードが異なっているのが原因だと思っています。 GetProcessesにIDとパスワードを設定してプロセスを取得することは 可能なのでしょうか。 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。

  • VBのプログラムで、実行時に与えられた値の取得方法について

    VB初心者です。 VBのプログラム呼び出しで、実行時に与えられた値を取得したいのですが、 そのやり方がわかりません。 「C:¥TEST.EXE "abc"」で、実行したとき、"abc"の文字列を TEST.EXEで取得したいのですが、このときのVBのコーディングを 教えて下さい。 宜しくお願い致します。 

専門家に質問してみよう