2017-05-19 122 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

我已更新答案,对错误表示歉意。 –