RPM确实有效,我无法弄清楚原因

时间:2014-04-15 22:05:00

标签: c#

继续搜索互联网并且无法解决这个问题,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);
    }
}

2 个答案:

答案 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

因为outref参数通过引用传递。然后,您应该能够使用int bread从缓冲区中的数据中删除过多的字节。