2016-07-02 14 views
2

Ich habe versucht, dies mit Process.EnterDebugMode() ausgeführt, aber es funktioniert auch nicht.64bit ReadProcessMemory Zugriff verweigert

Ich möchte die Notepad-memory vorlesen, aber ich weiß nicht, wie man darauf zugreifen, oder wenn das 64-Bit-System Probleme macht. Diese

ist das, was ich getan habe:

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Text; 

public class MemoryRead 
{ 

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

    [DllImport("kernel32.dll")] 
    static extern bool ReadProcessMemory(int hProcess, Int64 lpBaseAddress, byte[] buffer, int size, ref int lpNumberOfBytesRead); 

    [DllImport("kernel32.dll")] 
    static extern bool CloseHandle(IntPtr hObject); 

    static void Main(string[] args) 
    { 
     var pid = 10956; //notepad.exe 
     var processHandle = OpenProcess(0x10, false, pid); 

     byte[] buffer = new byte[24]; 
     int bytesRead = 0; 
     ReadProcessMemory((int)processHandle, 0x21106B35770, buffer, buffer.Length, ref bytesRead); //0x21106B35770 is the address where "hello world" is written in notepad 

     Console.WriteLine(Encoding.Unicode.GetString(buffer) + 
      " (" + bytesRead.ToString() + "bytes)"); 
     Console.ReadLine(); 
     CloseHandle(processHandle); 

     Console.ReadLine(); 
    } 
} 
+0

Führen Sie Ihre Anwendung als Administrator – dotctor

+0

Ich denke, Sie sollten es als x86 ausführen. Ich habe es vorher getan, und ich brauchte Administrator Privileg –

+0

Sie können Pinvoke Erklärungen von Methoden in www.pinvoke.net erhalten –

Antwort

0

Ihre PInvoke Erklärung ReadProcessMemory falsch ist (obwohl es auf einem 32-Bit-System arbeiten soll). auf jede Art

Ein Zeiger:

Wie aus der nativen Deklaration dieser Funktion

BOOL WINAPI ReadProcessMemory(
    _In_ HANDLE hProcess, 
    _In_ LPCVOID lpBaseAddress, 
    _Out_ LPVOID lpBuffer, 
    _In_ SIZE_T nSize, 
    _Out_ SIZE_T *lpNumberOfBytesRead 
); 

ersten Parameter ist HANDLE und it is a PVOID gesehen werden.

Dieser Typ wird in WinNT.h erklärt wie folgt:

typedef void * PVOID;

Und Zeiger auf alles in 64-Bit-Prozess ist ein 64-Bit-Wert - IntPtr.

Grundsätzlich gilt das gleiche für die size und lpNumberOfBytesRead Parameter - sie sind 64 Bit auch in einem 64-Bit-Prozess.

So sollte Ihre Erklärung so etwas wie:

[[DllImport("kernel32.dll", SetLastError = true)]] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern Boolean ReadProcessMemory(
    [In] IntPtr hProcess, 
    [In] IntPtr lpBaseAddress, 
    [Out] Byte[] lpBuffer, 
    [In] UIntPtr nSize, 
    [Out] out UIntPtr lpNumberOfBytesRead 
); 

PS: Und ein bisschen schamlose Eigenwerbung - wenn Sie überhaupt viel mit PInvoke arbeiten müssen, dann gibt es eine few good recommendations I‘ Ich habe hart gelernt.