Не весь ntos модуль промаплен под w2k3

Тема в разделе "WASM.NT.KERNEL", создана пользователем genesis, 20 дек 2007.

  1. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    Всем доброго времени суток.

    При старте драйвера, из DriverEntry (irql , конечно не подымался) нахожу адрес модуля ntos, и его размер (дабы поискать там знакомые сигнатуры, выдрать пару офсетов etc...)-

    lm nt
    start end module name
    804de000 80713000 nt ntoskrnl.exe Tue Mar 25 09:51:21 2003 (3E800A79)

    Проблема в том, что под w2k3 не видна некоторая часть модуля, соответственно, все валиться. Выглядит это так -

    dd 8067f000 - 4 l2
    8067effc f527a3e8 ????????

    readable - 804de000 to 8067f000
    unreadable - 8067f000 to 80713000

    и так до конца диапазона. Такую же картину можно наблюдать от любого процесса в системе (любой SessionId)

    В чем тут подвох, может кто-то сталкивался?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    сталкивался. Выгружаемые (0x02000000) секции. (например таблица импорта)
    это так и должно быть
     
  3. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    >это так и должно быть
    А можно немного поконкретнее? Например, как можно к ним получить доступ?
     
  4. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    никак они выгружены -)
     
  5. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    эээ... наверняка их можно как то загрузить? А как к этим страницам получают доступ все остальные? там же код... Можно более развернутое пояснение? или ссылку, где про это можно почитать...
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    genesis нет там кода, что это за адрес : 8067f000, откуда ты его взял?
     
  7. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    8067f000 - там начинаеться первая выгруженная страница...

    мда, раз кода нет - то и искать там нечего...
    можно перебрать секции и проверять IMAGE_SCN_MEM_EXECUTE ...
    ок, счас попробую.
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    дык а что надо то вообще
     
  9. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    да, правильный путь - парсить РЕ заголовок, брать оттуда смещения секций, складывать с имеющимся адресом модуля в памяти, и искать в секции... Все ок работает - всем спасибо :)
     
  10. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Не совсем правильный так как некоторые секции выгружаются не загрузчиком ОС, а самим же ядром, например секция оканчивающаяся на KD(Kernel Debugger), ядро если загружено без отладчика сама выгружает эти секции. Так что анализа PE заголовка недостаточно, самое простое что я сделал - проверил наличие страницы в памяти (PDE/PTE).
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    никак не получают - им не надо.

    а если она в свопе?...
     
  12. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    genesis
    ZwOpenFile ZwCreateSection ZwMapViewOfSection - кому экспортировали-документировали, пушкину? :)

    Great
    а разве оно не монопенисуально если ирк-левел слабее диспатча?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нет, не монописуально, если ты проверяешь PDE/PTE. там она будет помечена как отсутствующая.
    или если это проекция объекта Section - тоже может быть помечена как отсутствующая. Тут надо список VAD прочесывать.
     
  14. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Great
    Че-то я не догоняю, поясни
    if(MmIsAddressValid() && (irql < DISPATCH_LEVEL)) то еще что-то надо прочесывать?

    Кстати вот еще: как надежнее всего защититься от БСОДА в ситуации когда
    модуль выгружается системой а я в этот момент пытаюсь снять свой хук.
    Сейчас у меня так:

    Код (Text):
    1. if(ptr && MmIsAddressValid(ptr))
    2. {
    3.     KeEnterCriticalRegion();
    4.     disable_write_protect();
    5.  
    6.     *(TYPE_PROC*)ptr = original_proc;
    7.  
    8.     restore_write_protect();
    9.     KeLeaveCriticalRegion();
    10.            
    11.     ptr = NULL;
    12. }
    но уверенности что-то в этой конструкцыи нету :dntknw:
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    1) зачем проверка иркл? раз MmIsAddrssValid()==1 тогда уже адрес валиден при любом иркл
    2) ты так не все страницы включишь в дамп... если страница скинута в свопе, она не войдет у тебя. MmIsAddressValid возвращает TRUE если не будет Page Fault при обращении, то есть страница в физической памяти. А если она в свопе, но есть, то MmIsAddresValid будет FALSE и ты ее не включишь. Хотя при иркл<2 к ней можно обращаться

    Ты путаешь защиту от бсода и определение валидности адреса.
     
  16. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Great
    Ну ты меня запутал
    При чем здесь дамп?
    Я так имел в виду жывую систему...

    Приехали. С чего это вдруг? Попробуй-ка на диспатче с пагед-пулом поработать без Пробе-Энд-Лок

    Меня собственно волнуют очень редкие падения при попытке работы с только что освобожденной памятью. Но тут вроде медицына ядра бессильна :)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я вообще не понимаю о чем ты.. ТС интересует как определить валидность страницы. На низких иркл ((irql , конечно не подымался)). MmIsAddressValid не катит, потому как она конечно гарантирует валидность, но обратное неверное - не для всех страниц, для которых MmIsAddressValid вернет FALSE, будет бсод. Если страница выгружена, при обращений к ней конечно будет pf, но это пофигу на низких иркл. Поэтому ни MmIsAddressValid ни проверка вручную PDE/PTE не катит. Насколько я помню нет документированного способа провеирть валидность страницы для доступа при низком иркл( для высоких иркл есть MmIsAddressValid).
     
  18. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    А какое отношение юзер модная виртуальная память свазана с кернелом?
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    разве vad только для юзермода используется.. ну хз я не вникал именно в это особо
     
  20. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Имеено для этого и используется, хранится указатель на дерево(именно так хранится список этих структур) структур VAD в EPROCESS. И у каждого процесса он свой.