2013-05-12 3 views
2

Мне было интересно, есть ли способ контролировать область памяти для изменений. Я использую следующий метод для того, чтобы открыть процесс и получить коллекцию его используемых областей памяти: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») в это память:

enter image description here

Теперь я использовать эту вкладку, чтобы просмотреть другой, совершенно другой, веб-сайт и я вижу эти значения адресов меняется:

enter image description here

Последний шаг: я закрываю, что вкладка Chrome убивает его соответствующий процесс:

enter image description here

Итак ... конечно, ДОЛЖЕН быть своего рода мониторинг областей памяти. И в самом деле, есть:

enter image description here

Использование Process.Exited событие не достаточно для достижения реального времени обновления адреса памяти значения, я думаю ... так, как я могу это сделать?

+0

Я уверен, что вы не можете напрямую использовать .NET для этого. Возможно, вы сможете использовать Win32 API через interops, но AFAIK нет .NET API для такого рода вещей. – jugg1es

ответ

1

Если вы можете перехватить VirtualAlloc вызываются в целевом приложении, а также в сочетании MEM_WRITE_WATCH оригинальных флаги, система будет следить за эту выделенную область памяти, то вы можете вызвать функцию GetWriteWatch для получения адреса страниц, которые были записаны в поскольку регион был выделен, или состояние отслеживания записи было сброшено. Тем не менее, это много работает.

Смежные вопросы