Хочу прочитать память модулей ядра. Делаю чтение по секциям с флагами IMAGE_SCN_CNT_CODE и не установленным флагом IMAGE_SCN_MEM_DISCARDABLE. Последний нужен чтобы не налетать на BSOD при выгруженной секции. (если есть другии идеи можно озвучить) Далее чтение секции (Address - начало секции, Len - размер) PMDL mdl = IoAllocateMdl ( (PVOID)Address, Len, FALSE, FALSE, NULL); BOOLEAN ret = TRUE; PUCHAR out = (PUCHAR)Buffer; ULONG i = 0; ULONG MdlProcessed = 0; if ( !mdl ) { return FALSE; } __try { MmProbeAndLockPages ( mdl, KernelMode, IoReadAccess ); } __except ( EXCEPTION_EXECUTE_HANDLER ) { IoFreeMdl( mdl ); return FALSE; } { PCHAR buffer = MmGetSystemAddressForMdlSafe( mdl, NormalPagePriority ); if( !buffer ) { MmUnlockPages( mdl ); IoFreeMdl( mdl ); return FALSE; } for ( i = 0; i < Len; i++ ) { out[ i ] = *(PUCHAR)( (PUCHAR)buffer + i ); } MmUnlockPages( mdl ); IoFreeMdl( mdl ); } Все хорошо, но не для всех модулей. Модуль ntoskrnl.exe есть секция PAGEVRFY вот на ней BSOD в функции MmProbeAndLockPages, как и на секции INIT если не исключать IMAGE_SCN_MEM_DISCARDABLE. Если вместо MmProbeAndLockPages использовать MmBuildMdlForNonPagedPool то все хорошо, но эта функция только для буферов NonPagedPool следовательно надо гарантировать что все модули грузяться в NonPagedpool. Как быть просто исключать по имени не хочеться.
Спасибо посмотрел. Немного не понял как она работает. Так например при адрессах ядра не чего не выводит, говорит 0 valid bytes. Вопрос темы остается в силе.
Там многие секции после отработки освобождаются, как например INIT или секция релоков. Грузите с диска модуль.
Я так иделаю только мне надо сравнить то что есть на диске с тем что есть в памяти. С диском проблем нет - Гружу, релокаю. Потом начинаю по секционно сравнивать, все ок кроме этой PAGEVRFY. Причем пропускаю все IMAGE_SCN_MEM_DISCARDABLE - туда как раз INIT и .reloc и попадают.