C# ReadProcessMemory与C

C# ReadProcessMemory与C,c#,winapi,C#,Winapi,我正在写一个程序,创建一个进程,然后读取他的一些内存。为了获得地址,我使用了调试器OllyDbg using System; using System.Runtime.InteropServices; using System.Diagnostics; namespace winapi { class Program { [DllImport("kernel32.dll", SetLastError = true)] static extern

我正在写一个程序,创建一个进程,然后读取他的一些内存。为了获得地址,我使用了调试器OllyDbg

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace winapi
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool ReadProcessMemory(
          IntPtr hProcess,
          IntPtr lpBaseAddress,
          [Out] byte[] lpBuffer,
          int dwSize,
          out UInt32 lpNumberOfBytesRead
         );


        static void Main()
        {
            Console.WriteLine("WinAPI test");
            Console.WriteLine("---");
            Console.WriteLine();

            var startInfo = new ProcessStartInfo { FileName = "Program.exe" };
            Process p = Process.Start(startInfo);
            var bytes = new byte[4];
            uint read = 0;
            p.WaitForInputIdle();
            //  

            while (read == 0)
            {
                ReadProcessMemory(p.MainWindowHandle, (IntPtr)0x052f820, bytes, bytes.Length, out read);    
                System.Threading.Thread.Sleep(10);
            }

            Console.WriteLine(read.ToString());
            Console.ReadLine();
        }
    }
}
流程开始后,我的循环永远不会结束。 来自调试器的数据:

0052F820 | 75 2F 3F 72 61 67 65 5F 69 64 3D 31 33

我的错误在哪里?

为什么会结束?你一遍又一遍地读取相同的4个字节。ReadProcessMemory不像流那样工作。

为什么它会结束?你一遍又一遍地读取相同的4个字节。ReadProcessMemory不像流那样工作。

答案已经由@zmbq提供。ReadProcessMemory的行为与Stream不同,在Stream中,每个读取操作都会将总读取计数添加到Stream位置


我仍然可以看到代码的另一个问题,您传递的是窗口句柄而不是进程句柄。因此,即使您得到了结果,它也不会实际读取目标进程的内存。

答案已经由@zmbq提供。ReadProcessMemory的行为与Stream不同,在Stream中,每个读取操作都会将总读取计数添加到Stream位置


我仍然可以看到代码的另一个问题,您传递的是窗口句柄而不是进程句柄。因此,即使您得到结果,它也不会实际读取目标进程的内存。

lpNumberOfBytesRead返回读取的字节数。如果count=0,我将再次读取它。lpNumberOfBytesRead返回读取字节的计数。如果count=0,我将再次读取它。根据文档,如果函数失败,它将返回0。您没有检查返回值,您确定它成功了吗?如果没有,我相信它会告诉你你做错了什么。还要注意,每次内存地址都可能完全不同。根据文档,如果函数失败,它将返回0。您没有检查返回值,您确定它成功了吗?如果没有,我相信它会告诉你你做错了什么。还要注意,每次内存地址都可能完全不同。谢谢!我把p.MainWindowHandle换成了p.Handle,现在可以用了。谢谢!我将p.MainWindowHandle更改为p.Handle,现在它可以工作了。