Сканирование памяти в 64 бит?
Некоторое время назад я создал сканер памяти в C#, который считывал бы память процессов и искал определенные значения (например, местоположения каждого вхождения целого числа 42). С тех пор я повторно посетил этот проект и пытаюсь настроить его для работы в 64-битной системе. Проблема, с которой я сталкиваюсь, заключается в том, что 64-разрядным процессам предоставляется до 8 ТБ виртуальной памяти (по сравнению с скромными 2-4 ГБ в 32-разрядных системах)! По крайней мере, для моего кода невозможно сканировать каждый адрес в диапазоне 0-8 ТБ в любое разумное время.
Я попытался запустить сканирование в Process.MainModule.BaseAddress, но не знаю, где остановить чтение, и мне определенно не хватает важных значений. Как мне сузить поле, чтобы я мог просканировать диапазон того, что на самом деле использует процесс?
1 ответ
В итоге я выяснил, какие разделы памяти или виртуальные страницы использовались с помощью библиотечного метода VirtualQueryEx. Я использовал эту функцию, чтобы создать свою собственную "карту памяти" и определить используемые и доступные страницы. У Pinvoke есть хороший пример того, как это сделать: PInvoke Article
Просматривая разделы виртуальной памяти, помеченные как MEM_COMMIT, и проверяя, чтобы в разрешениях не было PAGE_GUARD, я смог найти необходимые фрагменты памяти, которые были релевантными и читаемыми.