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

时间:2019-02-01 12:54:15

标签: c# c++ memory driver ram

当我发现one of Asus old drivers容易受到物理内存读/写的攻击时,我正在浏览exploitdb。有展示如何从RAM中读取一个完全工作的PoC。问题是我有一个偏移量(比方说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

1 个答案:

答案 0 :(得分:1)

如果要查找内存的起始块和结束块,此代码应执行以下操作:

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

当然可以代替当前进程,而可以使用任何其他进程,例如:

Process.GetProcessById(processId)