Есть желание пошарить внутри адресных пространств системных модулей на предмет поиска сигнатур. Вот только не вся память доступна для чтения... Во всяком случае MmIsAddressValid возвращает (суммарно по всем системным модулям) доступных для чтения 10005632 байта и недоступных 2867200. Можно ли повысить процент доступной для чтения памяти, или вообще всю память сделать доступной?
это не память а адресное пространство причем судя по используемой функции MmIsAddressValid - системное т.е. общее для всех адресные пространства суть дырявые (по определению) сколько загрузили модулей - столько и замапили плюс пулы все такое может я не совсем понял вопрос? какую память "сделать доступной"?
Просто у драйверов могут быть discardable секции, это например секция INIT. После возврата из DriverEntry их память освобождается. Вот он наверно их и не может прочитать.
ЛОЛ! При чем тут секции? Память (озу) физически существует, независимо от того выгрузили секцию или нет. Кроме того, после выгрузки секции врядли область памяти, занимавшаяся этой секцией, обнуляется. Скорее всего, она просто помечается как "пустая". И там должна остаться информация. И то, что меня интересует, скорее всего и может оказаться в таком месте.
Скорее всего она выделяется под другие данные. К тому же врядли ты найдешь эту страницу в физической памяти, потому что оан там может находиться практически где угодно. Если тебе надо получить доступ к данным в такой секции, то грузи ее из файла на диске и не страдай фигней с поиском в памяти того, чего там скорее всего уже нет.
Заранее неизвестно, в каком файле искать Читать все .sys'ы на винте? Долго слишком. А если память освожденная секцией, отведена под другие данные, то почему их нельзя считать?
Потому что неизвестно откуда читать. Виртуальный адрес по которому находилась секция мог быть отображен на любой физический адрес, а на какой узнать нельзя. Если ищешь сигнатуры, то можешь читать всю физическую память и искать что-либо там.
cresta Посмотри в таблице страниц и получишь всю информацию о том, какая память ядра куда отображена (в данный момент, ес-но). А если и пользовательскую хочешь - "подключай" процессы с помощью KeAttachStackProcess и смотри в "их" памяти. На время поиска и каталоге страниц и копирования страницы к себе во временный буфер надо поднять IRQL чтобы страницу не успели выгрузить. Можно на основании таблицы страниц составить информацию о том, какая физическая память используется системой, а какая нет, и потом просканировать "резервы". Для этого надо самому модифицировать таблицу страниц, на время, под запрещенными прерываниями, чтобы получить доступ к любой физической памяти.
KeStackAttachProcess А на мультипроцессорных системах ее всеравно могут выгрузить. А вот этого делать не советую, так как обретешь много гимора с работой на разных ядрах. Страницы могут быть как 4кб так и 4мб, еще может использоваться PAE режим. Короче трудно сделать код работающий везде корректно. Для чтения физической памяти лучше юзать MmMapIoSpace.
Ms Rem KeStackAttachProcess писал по памяти, перепутал, я вообще до сих пор использовал просто KeAttachProcess по старинке. А на мультипроцессорных системах ее всеравно могут выгрузить. Ох уж эта многопроцессорность... Ну с этим тоже можно бороться, если очень уж надо универсальный код написать. много гимора с работой на разных ядрах. Страницы могут быть как 4кб так и 4мб, еще может использоваться PAE режим. Короче трудно сделать код работающий везде корректно. Согласен, модификация таблиц - последнее дело в силу своей сложности (там подводных камней хватает и помимо разных форматов таблиц, каталогов и их уровней вложенности), лучше ограничиться лишь чтением, это все-таки попроще.
если тебе надо физ.память то сделай себе отображение и читай ее до посинения только там станицы винигретом будут и как ты поймешь даже если найдешь свою сигнатуру - чья она задумайся