2012-04-01 25 views
0

メモリアドレスが静的な4バイト値を指しているときに動作するメモリから値を読み取るコードがありますが、ダイナミックにある4バイトの値にアクセスしようとしています場所と最初にポインタを検索し、再度4バイトの値を取得するために検索する必要があります。以下はC#ReadProcessMemory - ポインタへのアクセス/読み取り

は、ポインタのアドレスを返す必要があり、私が持っているコードですが、それは単に0 ...

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50) 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
txtOutput.Text = output.ToString(); 

私のように働いて見擬似コード出力:

bAddr = (IntPtr)0x0017C370; // Base address to find the Pointer (Currently: 0x00267A50) 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
bAddr = (IntPtr)output; // Should now contain the address 0x00267A50 
ReadProcessMemory(hProc, bAddr, buffer, 4, out bytesRW); 
output = BitConverter.ToInt32(buffer, 0); 
txtOutput.Text = output.ToString(); 

誰でも当てることができますが住所を見つけてその住所を検索して価値を見つけるために何をする必要があるのか​​を知ることができますか?

+0

'ReadProcessMemory'は何を返しますか?それはちょうど失敗しているかもしれません、その場合には 'GetLastError'がいくつかの光を放つかもしれません。 –

答えて

4

これは、pinvokeを使用してWin32関数を実行するときにはかなり古典的な間違いですが、エラーチェックは行っていません。したがって、どんな失敗も診断できません。まず、あなたがそれを正しく宣言したことを確認してください。

[DllImport("user32.dll", SetLastError = true)] 
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, 
    [In, Out] byte[] buffer, IntPtr size, out IntPtr lpNumberOfBytesRead); 

次に、このようにそれを実行します。

bool ok = ReadProcessMemory(...); 
if (!ok) throw new System.ComponentModel.Win32Exception(); 

それは動作しませんなぜ今、あなたが知っていますよ。そうでなければ、あなたが少なくともこのようにそれをテストするまで、何がうまくいかないかを理解する手助けをすることはできません。最も基本的な問題は、間違ったアドレスを推測することです。十分な特権を持たないReadProcessMemoryは、明白な理由から非常に特権のある機能です。

+0

これ。常に常にp/invoke呼び出しからあなたのhresultsをチェックしてください。実際に*エラーをスローしたくない場合は、新しいWin32Exception()を作成するだけでエラーの詳細がすべて読み込まれます。 – JerKimball

関連する問題