拒绝64位ReadProcessMemory访问

本文关键字:访问 ReadProcessMemory 64位 拒绝 | 更新日期: 2023-09-27 17:53:57

我试过用Process.EnterDebugMode()运行这个,但它也不起作用。

我想读出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();
    }
}

拒绝64位ReadProcessMemory访问

你的ReadProcessMemory的PInvoke声明是不正确的(尽管它应该在32位系统上工作)。

从这个函数的本机声明

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

其第一个参数为HANDLE,且为PVOID:

指向任意类型的指针。

在WinNT.h中声明如下:

typepedef void *PVOID;

指向64位进程的任何指针都是64位值- IntPtr。

sizelpNumberOfBytesRead参数基本相同,它们在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
);

注::还有一点无耻的自我推销——如果你曾经经常使用PInvoke,那么这里有一些很好的建议,我是经过一番努力才学会的。