Драйвер, узнаю адрес модуля - для пример своего загруженного дрова. Далее код МС-РЕМА по поиску таблицы импорта, смысл такой: (из комментария про обход аутпоста) Код (Text): PMDL mdl; PIMAGE_DOS_HEADER dHeader = Image; PIMAGE_THUNK_DATA Import; PIMAGE_IMPORT_DESCRIPTOR ImpDesc; PIMAGE_NT_HEADERS ntHeaders = RVATOVA(Image, dHeader->e_lfanew); ULONG ImpRVA; ImpRVA = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; if (ImpRVA) { ImpDesc = RVATOVA(Image, ImpRVA); // до этого места все идет хорошо while (ImpDesc->Name) {...} ..} ... Если этот код испытывать на своем драйвере, или на драйвере аутпоста, то он благополучно работает, в циклах можно пройтись по всем IMAGE_IMPORT_DESCRIPTOR и тд.. И изменить нужные адреса. Но например на драйвере ntsf.sys или кашперовского - этот трюк не катит, вылазит БСОД PAGE_FAULT_IN_NONPAGED_AREA при попытке обратиться к адресу исследуемого драйвера. Отладочник говорит что адрес таблицы импорта найдены верно (PE Explorer дает смещения таблицы импорта такие же как и ImpDesc). Но вот при чтении while (ImpDesc->Name) опять вылазит БСОД. Бсод вылазит когда я хочу прочитать память, которая находится по этому адресу (ImpDesc->Name). Эта память принадлежит исследуемому драйверу. На форуме есть похожие темы ( http://wasm.ru/forum/viewtopic.php?id=19905 ) ноответ мне там не очевиден. Подозреваю что нужно установить какие-то аттрибуты на память чтобы ее прочитать. Но как? Сделал: Код (Text): mdl =IoAllocateMdl(Image,sizeModule, FALSE, FALSE, NULL); if(!mdl) { DPRINT("IoAllocateMdl FALSE"); return ; } DPRINT("IoAllocateMdl OK"); if (MmIsNonPagedSystemAddressValid(mdl)) DPRINT("MmIsNonPagedSystemAddressValid OK"); else DPRINT("MmIsNonPagedSystemAddressValid FALSE"); try { MmBuildMdlForNonPagedPool(mdl); //MmProbeAndLockPages(mdl,KernelMode,IoReadAccess); } except(EXCEPTION_EXECUTE_HANDLER) { //DbgPrint( "Exception while locking buf 0X%08X\n", GetExceptionCode()); DPRINT("EXCEPTION_EXECUTE_HANDLER"); } IoFreeMdl(mdl); Пишет что MmIsNonPagedSystemAddressValid OK А далее как мнее ее можно прочитать? MmProbeAndLockPages - падает.. Прошу помощи в алгоритме: Что нужно сделать с памятью, чтобы можно было прочесть? Записывать пока не нужно..
А на каких секция сей код падает? В драйверах часто присуствует секция INIT, которая после загрузки драйвера отваливается. Возможно падает на ней.
Угу, скорее всего так. Пока с syser играюсь, смотрю что где находится, где что хранится и доступно.. Эх.. Грузить мне с диска дрова и мучиться с ними (