Отладка драйвера при помощи WinDbg

Тема в разделе "WASM.NT.KERNEL", создана пользователем nbyte, 17 июн 2008.

  1. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Здравствуйте.
    Как на свой код поставить я знаю.
    Хочу спросить, как можно при помощи WinDbg поставить breakpoint на работающий драйвер на который я исходников неимею.
    Допустим в W32Dasm я нашёл адрес на который я хочу поставить breakpoint, я загрузил windows в отладочном режиме и подсоединился к нему с WinDbg, как мне дальше можно поставить breakpoint?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
  3. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Чёт неособо я понял. Что с b* делать-то? :)
     
  4. wasm_test

    wasm_test wasm test user

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

    либо в графическом режиме дизассемблера нажать F9
     
  5. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Вообщем я неособо хорошо это дело знаю.
    Я понимаю что мне с начала нужно какбы выбрать адресное пространство работающего драйвера, а потом уже поставить bp. (Скорей всего я неправ)
    Объясните пожалуйста немного поподробней.
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Вывести список загруженных модулей (драйверов в kernel mode):
    lm [m mask]
    После этого прибавляешь RVA к адресу start и ставишь бряку.
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.218
    Адрес:
    Ukraine
    nbyte
    bp <адрес>

    Как узнать нужный адрес:
    RVA=<адрес нужного места в IDA> - <дефолтный адрес модуля драйвера>
    <адрес> = <актуальный адрес модуля драйвера> + RVA

    Чтобы эти расчёты не повторять для разных адресов, можно сделать ребазирование (в IDA: Edit->Segments->Rebase program).
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.587
    адресное пространство ядра одно.. за вычетом пространства сессии
     
  9. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    А <дефолтный адрес модуля драйвера> это Entrypoint или чтото другое?
    И можно-ли поставить bp на загрузку драйвера?
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.218
    Адрес:
    Ukraine
    nbyte
    Нет, поле Image Base из заголовка файла драйвера.
    Если смотришь драйвер в IDA, то это адрес первого сегмента - 0x1000.
    Да. sxe ld:<маска имени модуля>
     
  11. Sunzer

    Sunzer New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Windbg останавливается где-то в ядре, как брякнутся именно та EntryPoint драйвера?
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Sunzer
    bp DriverName!DriverEntry

    ?
     
  13. Sunzer

    Sunzer New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Говорю же в недрах ядра останавливается. А не на EP.
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Здесь sysexit описывает подобные симпотмы, потом пропадает. Вероятно, ему удалось решить проблему. Можно попробовать спросить там. У меня такого не было, но на всякий случай спрошу:

    1. Что показывает kb?
    2. Сообщает ли WinDbg, что ставит отложенную точку останова?
    3. Не совсем понятно, было ли введено до этого 'sxe ld:<маска имени модуля>'?

    В общем, больше деталей, пожалуйста.
     
  15. ratibor4212

    ratibor4212 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2018
    Сообщения:
    2
    Салют, друзья.

    Хотел кое-что спросить, но прежде всего хотелось бы отметить, что мне очень помогли ответы в этой теме.

    Особенно ответы про установку исключения sxe ld <маска имени модуля> и ответ, в котором приведены формулы для вычисления адреса брейкпоинта.

    Таким образом, сейчас я нахожусь в следующем положении (входные параметры примерно как у автора темы) :
    Я запускаю предварительно настроенную для отладки виртуальную машину, цепляюсь к ней windbg, происходит бряк...
    я смотрю список загруженных драйверов с помощью команды lm. Эта команда возвращает список, загруженных драйверов (модулей), и этот список уже не пустой. Далее, я устанавливаю исключение sxe ld <имя некоторого модуля, который будет загружен далее>
    Ловлю это исключение, вычисляю адрес брейкпоинта, или любым другим способ устанавливаю бряк в этом модуле... таким образом, всё замечательно работает. Я могу отлаживать некоторый модуль.

    Однако, никак не могу разобраться что делать, если требуется брякнуться в модуле, который был загружен ДО первой остановки отладчика?!

    Я читал кое-где что можно прописать /break в boot.ini
    И таким образом, якобы отладчику будет передано управление до загрузки всех модулей (ну, кроме некоторых).
    Однако, на windows 7 (и старше) не используется boot.ini насколько мне известно.

    Короче говоря, как на windows 7 (и старше) получить управление раньше, чем некоторые модули, которые загружаются раньше обычного.... (честно, не помню/не знаю от чего зависит первые перехват управление windbg и от чего зависит раньше/позде загружается драйвер, но оч надеюсь кто-нибудь поймет меня и подскажет, что можно сделать с этим )
     
  16. ratibor4212

    ratibor4212 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2018
    Сообщения:
    2
    Нашёл то, что нужно.
    Почему-то вчера не на гуглилось.
     

    Вложения: