Чтение образов ядра и драйверов, хелп..

Тема в разделе "WASM.WIN32", создана пользователем test555, 29 июн 2009.

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Драйвер, узнаю адрес модуля - для пример своего загруженного дрова.
    Далее код МС-РЕМА по поиску таблицы импорта, смысл такой: (из комментария про обход аутпоста)

    Код (Text):
    1. PMDL mdl;
    2. PIMAGE_DOS_HEADER dHeader = Image;
    3. PIMAGE_THUNK_DATA Import;
    4. PIMAGE_IMPORT_DESCRIPTOR ImpDesc;
    5. PIMAGE_NT_HEADERS ntHeaders = RVATOVA(Image, dHeader->e_lfanew);
    6. ULONG ImpRVA;
    7.  
    8. ImpRVA = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    9.  
    10. if (ImpRVA)
    11. {
    12. ImpDesc = RVATOVA(Image, ImpRVA);
    13. // до этого места все идет хорошо
    14.  
    15. while (ImpDesc->Name)
    16. {...}
    17. ..}
    18. ...
    Если этот код испытывать на своем драйвере, или на драйвере аутпоста, то он благополучно работает, в циклах можно пройтись по всем 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):
    1. mdl =IoAllocateMdl(Image,sizeModule,  FALSE, FALSE, NULL);
    2.     if(!mdl) {  DPRINT("IoAllocateMdl FALSE");         return ; }
    3.     DPRINT("IoAllocateMdl OK");
    4.     if (MmIsNonPagedSystemAddressValid(mdl))
    5.             DPRINT("MmIsNonPagedSystemAddressValid OK");
    6.                 else DPRINT("MmIsNonPagedSystemAddressValid FALSE");
    7.     try
    8.     { MmBuildMdlForNonPagedPool(mdl);
    9.         //MmProbeAndLockPages(mdl,KernelMode,IoReadAccess);
    10.     }
    11.     except(EXCEPTION_EXECUTE_HANDLER)
    12.     {
    13.         //DbgPrint( "Exception while locking buf 0X%08X\n", GetExceptionCode());
    14.         DPRINT("EXCEPTION_EXECUTE_HANDLER");
    15.     }
    16.    
    17.     IoFreeMdl(mdl);
    Пишет что MmIsNonPagedSystemAddressValid OK

    А далее как мнее ее можно прочитать?
    MmProbeAndLockPages - падает..

    Прошу помощи в алгоритме:
    Что нужно сделать с памятью, чтобы можно было прочесть?
    Записывать пока не нужно..
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    А на каких секция сей код падает? В драйверах часто присуствует секция INIT, которая после загрузки драйвера отваливается. Возможно падает на ней.
     
  3. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Угу, скорее всего так. Пока с syser играюсь, смотрю что где находится, где что хранится и доступно..
    Эх.. Грузить мне с диска дрова и мучиться с ними (