2016-07-02 4 views
2

Я пробовал работать с Process.EnterDebugMode(), но он также не работает.64bit ReadProcessMemory доступ запрещен

Я хочу прочитать Notepad-memory, но я не знаю, как к нему обращаться, или если 64-битная система справляется с проблемами.

Это то, что я сделал:

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

Запуск приложения в качестве администратора – dotctor

+0

Я думаю, вы должны запустить его как x86. Я сделал это раньше, и мне не нужны права администратора –

+0

, вы можете получить объявления о методах Pinvoke на www.pinvoke.net –

ответ

0

Ваше PInvoke декларация ReadProcessMemory неверно (хотя он должен работать на 32 битной системе).

Как видно из нативной декларации этой функции

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

его первый параметр HANDLE и it isPVOID:

указателя любого типа.

Этот тип объявлен в winnt.h следующим образом:

ЬурейеЕ пустот * PVOID;

И указатель на что-либо в 64-битном процессе - это 64-битное значение - IntPtr.

В принципе то же самое относится к параметрам size и lpNumberOfBytesRead - они также 64-битные в 64-разрядном процессе.

Таким образом, ваше объявление должно быть что-то вроде:

[[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: И немного бесстыдной саморекламы - если вы когда-нибудь придется много работать с PInvoke, то есть few good recommendations я вы усердно учились.

Смежные вопросы