2011-12-31 47 views
-2

我想在C#中製作一個內存掃描器。我聽說我需要API函數WriteProcessMemoryReadProcessMemory用C寫一個內存掃描器#

我打電話給他們:

[DllImport("kernel32.dll")] 
    public static extern bool ReadProcessMemory(
     IntPtr hProcess, 
     IntPtr lpBaseAddress, 
     byte[] lpBuffer, 
     UInt32 nSize, 
     ref UInt32 lpNumberOfBytesRead 
    ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool WriteProcessMemory(
     IntPtr hProcess, 
     IntPtr lpBaseAddress, 
     byte[] lpBuffer, 
     uint nSize, 
     out UIntPtr lpNumberOfBytesWritten); 

所有內存掃描儀我在谷歌發現是很難理解的例子。我讀過很多文章,說要找到值addr,你需要在任何內存字節搜索。現在我需要讓程序打開從內存中讀取和寫入的過程。

我可以使用GetProcessByName嗎?

+0

簡答:是的。長答案:是的。 – 2011-12-31 18:06:52

+0

[閱讀並嘗試瞭解此項目的來源](http://www.codeproject.com/KB/cs/sojaner_memory_scanner.aspx) – 2011-12-31 18:09:46

回答

2

是的,就像這樣:

Process[] process = Process.GetProcessesByName("cmd"); 
byte[] memory = new byte[255]; 
uint bytesRead =0; 
bool succes = ReadProcessMemory(
      process[0].Handle, 
      process[0].MainModule.BaseAddress , 
      memory , 
      (uint) memory.Length , 
      ref bytesRead); 

你必須檢查是否成功,是真實的。如果不是,你什麼也沒讀。

+0

man另一個問題,我不需要檢查過程是否工作。我想打開proggra程序以供以後讀取和寫入 – user1124295 2011-12-31 19:13:05

+0

@ user1124295任何正在運行的名爲cmd的進程都由此代碼示例'打開',並​​準備稍後讀取和寫入。所以你可以從這裏出發。我試圖解釋說,如果您爲內存地址提供的內存地址不在您讀取內存的進程的有效範圍內,則調用ReadProcesMemory可能會返回false。祝你好運。 – rene 2011-12-31 19:24:50