Какие варианты для отладки выноска водителя


Я новичок в разработке драйверов windows в режиме ядра и испытываю проблемы с получением отладочной информации из образцов выноски WFP. Я ищу либо больше вариантов, либо советы о том, что я делаю неправильно с вариантами, которые я пробовал.

Для начала я загрузил WFP sampler и следовал инструкциям в его описании. Я использую хост Windows 8.1 x64 и цель Windows 7 x64, подключенные через симулированный последовательный кабель. Они оба являются VirtualBox виртуальные машины.

Основная команда, с которой я отлаживаю, - это

WFPSampler.Exe -s PROXY -l FWPM_LAYER_ALE_BIND_REDIRECT_V4 -aaid "C:Program Files (x86)Internet Exploreriexplore.exe" -pla 10.0.2.15 -v

Где 10.0.2.15-IP-адрес другого сетевого интерфейса, чем таблица маршрутизации, на которую направляется трафик endign. Я также использовал следующую команду inspect, как рекомендовано инструкциями:

WFPSampler.exe -s BASIC_PACKET_EXAMINATION -l FWPM_LAYER_INBOUND_IPPACKET_V4 -v

"netshow Show state" показывает выноску и фильтр, связанные с ожидаемым слоем

Однако я никогда не получал никаких сообщений от traceview в соответствии с последними шагами этих инструкций. Tracelog имел похожие отсутствие выхода. Это было верно при включенной или не включенной трассировке WPP в проекте драйвера. Я также попробовал более высокую многословность, но все безрезультатно.

Кроме того, удаленный отладчик в visual studio либо останавливается на" Driver Post Install Actions (x64) (possible reboot): Pass", либо " ожидает повторного подключения..."перезагрузка цели не вызвала больше выходных данных в окне непосредственного вывода отладчика (окно вывода никогда не получало выходных данных). Перезагрузка целевой виртуальной машины не получила никаких необычных подсказок (некоторые вещи я читать подразумевалось, что он должен). Флажок " переподключить "при настройке отладчика иногда приводил к тому, что он пропускал "ожидание повторного подключения"..."подскажите, в другое время это было не нужно. Я установил несколько точек останова, которые должны были быть поражены, включая одну в верхней части каждой функции классификации, и ни одна из них никогда не была поражена.

Я пытался отлаживать с WinDbg, но, честно говоря, я не могу найти документацию о том, как использовать этот инструмент. Я запускаю его на целевой машине и выбираю kernel debug, local. потом я получить подсказку, которая говорит мне, что путь поиска символов недействителен и не имеет понятия, что я должен установить его. Любая документация о том, как использовать этот инструмент, а не просто установить его, может быть полезна, если он позволяет мне отлаживать эти драйверы выноски.

Наконец, конечно, я попытался просто отладить его на основе симптомов, и я обнаружил, что выноска examination ничего не делает, насколько я могу судить, в то время как выноска proxy просто съедает весь трафик из целевого приложения, с одной оговоркой. Это предостережение что когда я нацеливаюсь на firefox или chrome с помощью выноски прокси и пытаюсь запустить это приложение, оно не запускает пользовательский интерфейс, и частично запущенный процесс не может быть убит из Диспетчера задач.

Я предположил, что поведение может быть результатом того, что образец не может проверить FwpsQueryPacketInjectionState, но изменение, насколько я могу понять, что должно использоваться, похоже, не изменяет поведение.

Короче говоря, я застрял и мне нужно направление, пожалуйста?

2 2

2 ответа:

Я начал экспериментировать с WFPSampler, а также обнаружил, что трассировка не работает. Как ни странно, было много дополнительного кода, чтобы заставить WPP tracing работать на нескольких ОС, но образец не фиксирует никаких событий трассировки. Поэтому я отладил его и нашел вызов nt!WmiTraceMessage всегда передавал 2 как TRACE_HANDLE. Это казалось плохим. С уверенностью можно сказать, что это было не совсем прямо вперед, чтобы расшифровать макросы WPP, а затем, наконец, найти происхождение в .файл vcxprog. То определение WPP_COMPID_LEVEL_LOGGER (COMPID,LEVEL)=2 неверно. В то время как я был там, я также преобразовал уровни DbgPrintEx в соответствие Tace_Level, добавив 2, чтобы ошибка/предупреждение соответствовали модели.

Выполните следующие действия для SysLib / WFPSampler и Sys/WFPSamplerCalloutDriver

  1. откройте проект
  2. щелкните правой кнопкой мыши на WFPSamplerCalloutDriver
  3. Разгрузить Проект
  4. правый Cick на WFPSamplerCalloutDriver
  5. править WFPSamplerCalloutDriver.vcxproj
  6. Тип: WppPreprpocessorDefinitions

  7. Измените это определение в обоих местах файла:

Кому:

<WppTraceFunction>DbgPrintEx(COMPID,LEVEL,MSG,...)</WppTraceFunction
<WppPreprocessorDefinitions>WPP_COMPID_LEVEL_LOGGER(COMPID,lvl)=(WPP_CONTROL(0).Logger),;WPP_COMPID_LEVEL_ENABLED(COMPID,lvl)=(WPP_CONTROL(0).Level >= lvl+2)</WppPreprocessorDefinitions>
  1. сохраните файл
  2. правый Cick на WFPSamplerCalloutDriver
  3. Нажмите Перезагрузить Проект
  4. перестроить
Я считаю, что если вы примете эту модель использования DbgPrintEx в качестве функции трассировки, вы можете переключиться на WPP без редактирования всего проекта. Тем не менее, я все еще думаю, что это лучше просто конвертировать в вашей программе.

Ура,

Джон

Не совсем ответ на этот вопрос, у меня никогда не работал отладчик, но объяснение того, почему образец wfpsampler не работал для проксирования слоями ALE. Конечная цель этого проекта.

В прокси-вызове были такие строки (Я думаю, что до моего рефактора они были в методеPerformProxySocketRedirection ):

if (ipProtocol == IPPROTO_TCP)
    pBindRequest1->portReservationToken = (pRedirectData)->pProxyData->tcpPortReservationToken;
else if (ipProtocol == IPPROTO_UDP)
    pBindRequest1->portReservationToken = (pRedirectData)->pProxyData->udpPortReservationToken;

UdpPortReservationToken или tcpPortReservationToken должны были быть инициализированы вызовом CreatePersistentUdpPortReservation илиCreatePersistentTcpPortReservation и это обрабатывается в вспомогательной функции с именемHlprWinSockCreatePortReservation , но указанная вспомогательная функция никогда не вызывается из любого места во всем решении. Эти поля никогда не устанавливаются, нигде и никогда.

Кроме того, это значение нужно было установить только в том случае, если локальный порт был изменен, но этот блок кода выполнялся независимо.

Удалите эти строки, и до тех пор, пока вы этого не сделаете измените локальный порт, образец перенаправления ale работает так,как вы ожидаете, включая изменение исходящего интерфейса, если вы измените локальный IP. Если вам нужно изменить локальный порт, вам придется использовать HlprWinSockCreatePortReservation для инициализации соответствующей переменной маркера резервирования порта в PROXY_DATA. Это должно быть сделано в пользовательском режиме, поэтому вам нужно сделать это в сервисе при настройке фильтра.

Отказ от ответственности: я думаю, что это единственное важное изменение, но если вы здесь для решения этой проблемы знаете, что во время отслеживания этого без рабочего отладчика я изменил смехотворно большое количество кода, так что, возможно, было больше, чем я забыл в течение последних нескольких недель. Но я вернулся и убедился, что этот блок всегда вызывался, и эти поля никогда не были установлены в оригинале.