C# ReadProcessMemory与C
我正在写一个程序,创建一个进程,然后读取他的一些内存。为了获得地址,我使用了调试器OllyDbgC# 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
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,现在它可以工作了。