2017-05-19 151 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在這種情況下。但是,我可以在Cheat Engine中使用此指針來瀏覽其內存區域,並找到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指向一個特定的內存區域,在那裏另一個Offset指向我需要讀取的「float」。 – Sami

回答

0

變化進行ReadProcess 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型偏移量(十六進制)添加到基地址?編輯:似乎添加一個偏移量(firstOffset)到基地和讀取內存給出了正確的「臨時地址」。從那裏我需要進一步去0xFC找到最終的浮點數。 – Sami

+0

我已更新答案,對錯誤表示歉意。 –