Может кто-нибудь объяснить системный вызов Windows ZwMapViewOfSection, чтобы нуб (я) мог понять?
Я изучаю набор системных вызовов Windows API, выполняемых вредоносной программой, работающей в "песочнице", чтобы понять ее вредоносные намерения. К сожалению, я изо всех сил пытаюсь понять функцию ZwMapViewOfSection, описанную в документации: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-zwmapviewofsection
Теперь я понимаю, что эта функция связана с отображением физической памяти в виртуальную память в таблице страниц. Кроме того, я нахожу документацию загадочной и не дружелюбной для начинающих. Я также сбит с толку, почему они называют блоки физической памяти "разделами", а не "фреймами" (если это то, на что они действительно ссылаются - мне не ясно). Может ли кто-нибудь дать более интуитивное объяснение этого системного вызова и того, что он делает в целом? Это обычный системный вызов для программ или он ограничен вредоносным ПО? Благодарю вас.
2 ответа
Обычные программы очень часто делают этот вызов (конечно, не напрямую), каждая программа будет вызывать его несколько раз во время инициализации, по крайней мере (ZwMapViewOfSection используется при выполнении резервного копирования памяти, используемого для реализации исполняемых разделов кода). сам). Не так часто встречается во время нормального программного кода, но также не редкость. Особенно распространено, если программа выполняет динамические загрузки DLL, но легитимные программы могут также выполнять сопоставление памяти с вводом-выводом по своим собственным причинам.
Он работает с объектами раздела памяти (я так и не понял этого имени), которые являются одной из частей связи между файлами диска и областями отображения памяти, раздел создается с помощью ZwCreateSection или открывается с помощью ZwOpenSection, а затем другая часть входит в играть с ZwMapViewOfSection.
Какая часть этого именно вас смущает? Знание этого сделало бы намного легче дать информативный ответ.
Насколько я понимаю, вы должны открыть файл и получить дескриптор файла, который затем сопоставляете с
CreateFileMapping
, который создаст объект изображения или раздела данных для файла, объекта сегмента, объектов подраздела (для изображения). Затем вы передаете возвращенный дескриптор объекта раздела в
MapViewOfFile
, который будет звонить
NtMapViewOfSection
на нем, который призывает
MmMapViewOfSegment
, который вызывает
MmCreateMemoryArea
, где представление отображается в VAD процесса. При первом обращении к адресу в диапазоне, нулевой (неизвестный) PTE приводит к ошибке страницы: проверяется VAD, который содержит первый адрес PPTE для сопоставленного диапазона. Теперь можно рассчитать правильный PPTE и соответствующее смещение в файле. Затем PPTE заполняется по запросу с выделенной физической страницей, заполненной записью ввода-вывода для этого диапазона, и PTE процесса заполняется тем же адресом. Когда PTE удаляется из рабочего набора процесса, диспетчер рабочего набора обращается к PFN, чтобы найти адрес PPTE, уменьшает количество общих ресурсов и вставляет этот адрес в PTE. Я не знаю, насколько важно различать VAD PTE и неизвестный PTE.