继续搜索互联网并且无法解决这个问题,ReadProcessMemory
正在返回,以便执行。但输出总是空的。数组的长度也是0
。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace MemEd
{
class Program
{
static void Main(string[] args)
{
Process proc = Process.GetProcessesByName("client")[0];
byte[] buff = new byte[]{};
IntPtr bread;
IntPtr pHandle = OpenProcess(0x0010, false, proc.Id);
bool check = ReadProcessMemory(pHandle, (IntPtr)0x5EFF75B8, buff, 10, out bread);
if (!check)
Console.WriteLine("RPM Fail");
Console.WriteLine(buff.Length); //ALWAYS returns 0, Even the value is a string "xyle"
Console.WriteLine(Encoding.Unicode.GetString(buff));//Always empty, tryed most of Encoding types to check still a blank result.
Console.ReadKey();
}
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out IntPtr lpNumberOfBytesRead);
}
}
答案 0 :(得分:1)
这可能是因为您填充的缓冲区长度为0
,因为您将其初始化为空(new byte[] {}
)。试着给它一些空间:
byte[] buff = new byte[1024];
根据您要阅读的内存量更改数字,然后将长度用作dwSize
参数:
ReadProcessMemory(pHandle, (IntPtr)0x5EFF75B8, buff, (UInt32)buff.Length, out bread);
另外,请确保您通过this answer获得了正确的权限。您可能需要使用提升的权限运行应用程序。
答案 1 :(得分:0)
尝试在创建时指定buff
数组的大小。
byte[] buff = new byte[some_size];
还有。我相信ReadProcessMemory
方法声明的最后一个参数应该替换为
out int lpNumberOfBytesRead
因为out
和ref
参数通过引用传递。然后,您应该能够使用int bread
从缓冲区中的数据中删除过多的字节。