Мне было интересно, есть ли способ контролировать область памяти для изменений. Я использую следующий метод для того, чтобы открыть процесс и получить коллекцию его используемых областей памяти:C#/WinAPI - Мониторинг области памяти
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));
}
Я видел много приложений делают это. Cheat Engine - один из них. Допустим, я открываю процесс Google Tab Chrome и я искать и находить конкретное значение (строка «StackOverflow») в это память:
Теперь я использовать эту вкладку, чтобы просмотреть другой, совершенно другой, веб-сайт и я вижу эти значения адресов меняется:
Последний шаг: я закрываю, что вкладка Chrome убивает его соответствующий процесс:
Итак ... конечно, ДОЛЖЕН быть своего рода мониторинг областей памяти. И в самом деле, есть:
Использование Process.Exited событие не достаточно для достижения реального времени обновления адреса памяти значения, я думаю ... так, как я могу это сделать?
Я уверен, что вы не можете напрямую использовать .NET для этого. Возможно, вы сможете использовать Win32 API через interops, но AFAIK нет .NET API для такого рода вещей. – jugg1es