2017-05-19 2 views
0

プロセスモジュールのベースアドレスとオフセットを使用してメモリを読み取るにはどうすればよいですか?私は、次の所望のモジュールのベースアドレスをつかんでいますReadProcessMemoryをプロセスモジュールのベースアドレスとオフセットに使用する

その後
 Process process = Process.GetProcessesByName("process")[0]; 
     ProcessModule bClient; 
     ProcessModuleCollection bModules = process.Modules; 
     IntPtr processHandle = OpenProcess(0x10, false, process.Id); 
     int firstOffset = 0xA4C58C; 
     int anotherOffset = 0xFC; 

     for (int i = 0; i < bModules.Count; i++) 
     { 
      bClient = bModules[i]; 
      if (bClient.ModuleName == "module.dll") 
      { 
       IntPtr baseAddress = bClient.BaseAddress; 
       Console.WriteLine("Base address: " + baseAddress); 
      } 
     } 

私は最初のベースアドレスにオフセットを追加しました:

IntPtr firstPointer = IntPtr.Add(baseAddress, (int)firstOffset); 

これは私にポインタを与えます。この場合440911244。

たとえば、メモリ領域を参照してanotherPointerが指し示す値を見つけるのに、このポインタを使用することはできますが、firstPointerにオフセットを追加する適切な方法はありません。

私の質問は、最後にanotherOffsetをポインタに追加する直前にReadProcessMemoryを使用する必要がありますか?もしそうなら、この場合、それを使う正しい方法は何ですか?

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool ReadProcessMemory(
IntPtr hProcess, 
IntPtr lpBaseAddress, 
IntPtr lpBuffer, 
int dwSize, 
out IntPtr lpNumberOfBytesRead); 
+0

"anotherOffset" とは何ですか?あなたはプロセスの記憶から何を読むと思いますか? –

+0

@KrzysztofBracha firstOffsetは特定のメモリ領域を指し、anotherOffsetは読み込みが必要な "float"を指します。 – Sami

答えて

0

変更ReadProcessMemory lpBufferののparamater:その後、

byte[] lpBuffer, 

byte[] buffer = new byte[sizeof(float)]; 
IntPtr bytesRead = IntPtr.Zero; 

IntPtr readAddress = IntPtr.Add(baseAddress, firstOffset); 
readAddress = IntPtr.Add(readAddress, anotherOffset) 

ReadProcessMemory(processHandle, readAddress, buffer, buffer.Length, out bytesRead); 

float value = BitConverter.ToSingle(buffer, 0); 
+0

ありがとうございました。私はそれが働いたとは思わない。基本アドレスにオフセットを追加するだけで、間違った場所を指しているようです。ベースアドレスにint型のオフセット(16進数)を追加することは可能ですか?編集:基盤にちょうど1つのオフセット(firstOffset)を追加し、メモリを読み取るように右 "一時アドレス"を与えます。そこから、最後のフロートを見つけるためにさらに0xFCに行く必要があります。 – Sami

+0

私は答えを更新しました。間違いのためにお詫び申し上げます。 –

関連する問題