ここから本文です

vb.net でとあるEXEがつかっているメモリの中身が見たいのですが方法がまったくわ...

このエントリーをはてなブックマークに追加

質問者

pasonanic2000さん

2012/1/1115:31:26

vb.net でとあるEXEがつかっているメモリの中身が見たいのですが方法がまったくわかりません。
ReadProcessMemory というのも見つけたのですが 使い方がわかりません。

dumpのStringですべてをとりたいんですが
どのようにしたらいいでしょうか?
サンプルなどを提供いただけると幸いです・

閲覧数:
1,389
回答数:
1

違反報告

ベストアンサーに選ばれた回答

nlfotisさん

2012/1/1200:05:45

ReadProcessMemory の使い方の例を載せておきます。
実行中のメモ帳のメモリを読み取るサンプルです。

Imports System.Runtime.InteropServices

Public Class Form1

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function

<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, ByRef lpdwProcessId As IntPtr) As IntPtr
End Function

<DllImport("kernel32.dll")> _
Private Shared Function OpenProcess(ByVal dwDesiredAccess As Integer, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
End Function

Private Const PROCESS_VM_READ As Integer = &H10
Private Const PROCESS_QUERY_INFORMATION As Integer = &H400

<DllImport("kernel32.dll", SetLastError:=True)> _
Public Shared Function ReadProcessMemory( _
ByVal hProcess As IntPtr, _
ByVal lpBaseAddress As IntPtr, _
<Out()> ByVal lpBuffer() As Byte, _
ByVal dwSize As Integer, _
ByRef lpNumberOfBytesRead As Integer _
) As Boolean
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim hwnd As IntPtr = FindWindow("Notepad", Nothing)
Dim pid As IntPtr
GetWindowThreadProcessId(hwnd, pid)
Dim ph As IntPtr = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, 0, pid)

Dim buf As Byte() = New Byte(99) {}
Dim readBytes As Integer
If ReadProcessMemory(ph, &H800000, buf, buf.Length, readBytes) <> 0 Then
MessageBox.Show("OK", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
Dim errorCode As Integer = Marshal.GetLastWin32Error()
MessageBox.Show("Error", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub

End Class

ReadProcessMemory で指定しているアドレス &H800000 は適当に設定した値です。

C で書かれていますが、
http://www5.plala.or.jp/softworld/api_ReadProcessMemory.htm
が参考になると思います。
ここで使用されている NtQueryInformationProcess はエクスポートされていないので GetProcAddress を使用せざるを得ないのです ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=... の最後にも総記述されています。) が、.NET で GetProcAddress によって取得した関数を実行する方法については

http://dobon.net/vb/dotnet/links/extractarchive.html
の「遅延バインディングによる方法」が参考になると思います。

質問した人からのコメント

2012/1/15 02:40:37

ありがとうございます。 メモリの読み取りは可能でしたがメモリアドレスが固定ではない
アプリでしたので あきらめました本当にありがとうございました

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル
  • このエントリーをはてなブックマークに追加

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する