Здравствуйте. Как на свой код поставить я знаю. Хочу спросить, как можно при помощи WinDbg поставить breakpoint на работающий драйвер на который я исходников неимею. Допустим в W32Dasm я нашёл адрес на который я хочу поставить breakpoint, я загрузил windows в отладочном режиме и подсоединился к нему с WinDbg, как мне дальше можно поставить breakpoint?
Вообщем я неособо хорошо это дело знаю. Я понимаю что мне с начала нужно какбы выбрать адресное пространство работающего драйвера, а потом уже поставить bp. (Скорей всего я неправ) Объясните пожалуйста немного поподробней.
Вывести список загруженных модулей (драйверов в kernel mode): lm [m mask] После этого прибавляешь RVA к адресу start и ставишь бряку.
nbyte bp <адрес> Как узнать нужный адрес: RVA=<адрес нужного места в IDA> - <дефолтный адрес модуля драйвера> <адрес> = <актуальный адрес модуля драйвера> + RVA Чтобы эти расчёты не повторять для разных адресов, можно сделать ребазирование (в IDA: Edit->Segments->Rebase program).
А <дефолтный адрес модуля драйвера> это Entrypoint или чтото другое? И можно-ли поставить bp на загрузку драйвера?
nbyte Нет, поле Image Base из заголовка файла драйвера. Если смотришь драйвер в IDA, то это адрес первого сегмента - 0x1000. Да. sxe ld:<маска имени модуля>
Здесь sysexit описывает подобные симпотмы, потом пропадает. Вероятно, ему удалось решить проблему. Можно попробовать спросить там. У меня такого не было, но на всякий случай спрошу: 1. Что показывает kb? 2. Сообщает ли WinDbg, что ставит отложенную точку останова? 3. Не совсем понятно, было ли введено до этого 'sxe ld:<маска имени модуля>'? В общем, больше деталей, пожалуйста.
Салют, друзья. Хотел кое-что спросить, но прежде всего хотелось бы отметить, что мне очень помогли ответы в этой теме. Особенно ответы про установку исключения sxe ld <маска имени модуля> и ответ, в котором приведены формулы для вычисления адреса брейкпоинта. Таким образом, сейчас я нахожусь в следующем положении (входные параметры примерно как у автора темы) : Я запускаю предварительно настроенную для отладки виртуальную машину, цепляюсь к ней windbg, происходит бряк... я смотрю список загруженных драйверов с помощью команды lm. Эта команда возвращает список, загруженных драйверов (модулей), и этот список уже не пустой. Далее, я устанавливаю исключение sxe ld <имя некоторого модуля, который будет загружен далее> Ловлю это исключение, вычисляю адрес брейкпоинта, или любым другим способ устанавливаю бряк в этом модуле... таким образом, всё замечательно работает. Я могу отлаживать некоторый модуль. Однако, никак не могу разобраться что делать, если требуется брякнуться в модуле, который был загружен ДО первой остановки отладчика?! Я читал кое-где что можно прописать /break в boot.ini И таким образом, якобы отладчику будет передано управление до загрузки всех модулей (ну, кроме некоторых). Однако, на windows 7 (и старше) не используется boot.ini насколько мне известно. Короче говоря, как на windows 7 (и старше) получить управление раньше, чем некоторые модули, которые загружаются раньше обычного.... (честно, не помню/не знаю от чего зависит первые перехват управление windbg и от чего зависит раньше/позде загружается драйвер, но оч надеюсь кто-нибудь поймет меня и подскажет, что можно сделать с этим )