2014-04-15 176 views
0

繼續搜索互聯網,無法弄清楚這一點,ReadProcessMemory返回就好,因此它的執行。但輸出總是空的。陣列的長度也是0RPM工作,我不知道爲什麼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace MemEd 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Process proc = Process.GetProcessesByName("client")[0]; 
      byte[] buff = new byte[]{}; 
      IntPtr bread; 
      IntPtr pHandle = OpenProcess(0x0010, false, proc.Id); 
      bool check = ReadProcessMemory(pHandle, (IntPtr)0x5EFF75B8, buff, 10, out bread); 
      if (!check) 
       Console.WriteLine("RPM Fail"); 

      Console.WriteLine(buff.Length); //ALWAYS returns 0, Even the value is a string "xyle" 
      Console.WriteLine(Encoding.Unicode.GetString(buff));//Always empty, tryed most of Encoding types to check still a blank result. 
      Console.ReadKey(); 
     } 


     [DllImport("kernel32.dll")] 
     public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); 

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

回答

1

這可能是因爲你給它填充緩衝區有0的長度,因爲你初始化它完全空(new byte[] {})。試着給它一定的空間:

byte[] buff = new byte[1024]; 

更改數量根據你要多少內存讀取,然後用長度爲您dwSize參數:

ReadProcessMemory(pHandle, (IntPtr)0x5EFF75B8, buff, (UInt32)buff.Length, out bread); 

此外,還要確保你已經通過this answer獲得了正確的權限。您可能需要使用提升的權限運行應用程序。

+1

並確保傳遞dwSize(本例中爲1024)的緩衝區大小,而不是您當前擁有的10個緩衝區大小。 –

0

嘗試在創建時指定buff陣列的大小。

byte[] buff = new byte[some_size]; 

還有。我相信ReadProcessMemory方法聲明的最後一個參數應與

out int lpNumberOfBytesRead 

因爲outref參數按引用傳遞來代替。然後,您應該能夠使用int bread從緩衝區中的數據中截斷多餘的字節。

+0

我剛剛複製粘貼該導入。我從來沒有真正明白如何使用最後一個參數。感謝您的使用! – RichardP

相關問題