我想知道是否有一种方法可以监视特定内存区域的更改。我正在使用以下方法来打开一个进程并获取其已用内存区域的集合:
internal static MemoryProcess OpenProcess(Process process)
{
IntPtr processHandle = OpenProcess(ProcessAccess.Desided, true, (UInt32)process.Id);
if (processHandle == IntPtr.Zero)
return null;
IntPtr processAddress = new IntPtr();
List<MemoryRegion> memoryRegions = new List<MemoryRegion>();
while (true)
{
MemoryBasicInformation info = new MemoryBasicInformation();
if (VirtualQueryEx(processHandle, processAddress, out info, MemoryBasicInformation.Size) == 0)
break;
if (info.Allocation.HasFlag(MemoryAllocation.Commit) && info.Type.HasFlag(MemoryType.Private) && ((info.Protection & MemoryProtection.Readable) != 0) && ((info.Protection & MemoryProtection.Protected) == 0))
memoryRegions.Add(new MemoryRegion(info.BaseAddress, info.RegionSize));
processAddress = new IntPtr(info.BaseAddress.ToInt64() + info.RegionSize.ToInt64());
}
if (memoryRegions.Count == 0)
{
CloseHandle(processHandle);
return null;
}
return (new MemoryProcess(processHandle, memoryRegions));
}
我看到很多应用程序都在这样做。作弊引擎就是其中之一。假设我打开了一个 Google Chrome Tab 进程,并在它的内存中搜索并找到了一个特定值(字符串“stackoverflow”):
现在,我使用该选项卡浏览另一个完全不同的网站,我看到这些地址值发生了变化:
最后一步:我关闭该 Chrome 选项卡,终止其相应的进程:
所以......当然必须对内存区域进行某种监视。而且,事实上,有:
使用 Process.Exited 事件不足以实现我认为的内存地址值的实时更新......那么,我该怎么做呢?