如何使用 C# 在 Windows 中获取另一个进程基地址?

How can I get another process base adress in Windows using C#?

当我发现 one of Asus old drivers 容易受到物理内存 read/write 的攻击时,我正在浏览 exploitdb。有一个完整的 PoC 展示了如何从 RAM 中读取。问题是我有一个偏移量(假设为 0x31E4),它指示我在程序内存中需要的值的相对位置,但驱动程序正在返回绝对 windows 地址的信息。如何在物理内存中获取基本进程地址(最好是在 C# 中)?有可能吗?

示例伪代码:

DWORD offset = 0x31E4; // Offset
int size = sizeof(float); // Size of float
float output = Read(ProgramBase + offset, size); // Read function that read absolute value from RAM, for that I need ProgramBase

如果你想找到内存的起始块和结束块,这段代码应该做到:

  Process p = Process.GetCurrentProcess();
  IntPtr startMemory= p.MainModule.BaseAddress; 
  IntPtr endMemory= IntPtr.Add(startMemory,p.MainModule.ModuleMemorySize);

当然不是当前进程,你可以得到任何其他进程,例如:

Process.GetProcessById(processId)