我已尝试使用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();
}
}
答案 0 :(得分:0)
您的ReadProcessMemory的PInvoke声明不正确(尽管它应该适用于32位系统)。
从该函数的原生声明中可以看出
BOOL WINAPI ReadProcessMemory(
_In_ HANDLE hProcess,
_In_ LPCVOID lpBaseAddress,
_Out_ LPVOID lpBuffer,
_In_ SIZE_T nSize,
_Out_ SIZE_T *lpNumberOfBytesRead
);
第一个参数是HANDLE
,it is一个PVOID
:
指向任何类型的指针。
此类型在WinNT.h中声明如下:
typedef void * 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
);
P.S。:还有一点无耻的自我推销 - 如果你不得不与PInvoke一起工作,那么有一个few good recommendations我学到了很多东西。