【问题标题】:What are options for debugging WFP callout driver调试 WFP 标注驱动程序的选项有哪些
【发布时间】:2014-12-17 05:11:09
【问题描述】:

我是内核模式 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 Explorer\iexplore.exe" -pla 10.0.2.15 -v

其中 10.0.2.15 是不同网络接口的 IP 地址,而不是路由表是 endign 流量的目标。我还按照说明使用了以下检查命令:

WFPSampler.exe -s BASIC_PACKET_EXAMINATION -l FWPM_LAYER_INBOUND_IPPACKET_V4 -v

“netsh wfp show state”显示与预期层关联的标注和过滤器

但是,按照这些说明的最后步骤,我从未从 traceview 收到任何消息。 Tracelog 也有类似的输出不足。无论是否在驱动程序项目上启用了 WPP 跟踪,情况都是如此。我还尝试了更高的详细程度,但都没有效果。

此外,Visual Studio 中的远程调试器在“驱动程序安装后操作(x64)(可能重新启动):通过”或“等待重新连接...”处停止,重新启动目标不会导致调试器立即窗口中的更多输出(输出窗口从未得到任何输出)。重新启动目标 VM 没有得到任何异常提示(我读到的一些内容暗示它应该)。设置调试器时的重新连接复选框有时会导致它通过“等待重新连接...”提示,其他时候不需要它。我设置了许多应该被命中的断点,包括每个分类函数顶部的一个断点,但没有一个被命中。

我尝试使用 WinDbg 进行调试,但坦率地说,我找不到有关如何使用此工具的文档。我在目标机器上启动它并选择内核调试,本地。然后我得到一个提示,告诉我符号搜索路径无效,并且不知道我应该将其设置为什么。如果它能让我调试这些标注驱动程序,那么任何关于如何使用这个工具而不是仅仅安装它的文档都可能会有所帮助。

当然,最后我尝试根据症状对其进行调试,但我发现检查标注没有任何作用,而代理标注只是吃掉来自目标应用程序的所有流量,但有一个警告。需要注意的是,当我使用代理标注定位 firefox 或 chrome 并尝试启动该应用程序时,它无法启动 UI,并且无法从任务管理器中终止部分启动的进程。

我认为该行为可能是样本未能检查 FwpsQueryPacketInjectionState 的结果,但尽我所能进行修改似乎并没有改变行为。

所以简而言之,我被卡住了,需要指导吗?

【问题讨论】:

    标签: windows debugging windbg wfp


    【解决方案1】:

    不完全是这个问题的答案,我从来没有让调试器工作,但解释了为什么 wfpsampler 示例不能用于 ALE 层的代理。这个项目的最终目标。

    在代理标注中有这些行(我认为在我重构之前它们在 PerformProxySocketRedirection 方法中):

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

    udpPortReservationTokentcpPortReservationToken 应该已通过调用 CreatePersistentUdpPortReservationCreatePersistentTcpPortReservation 进行初始化,这在一个名为 HlprWinSockCreatePortReservation 的辅助函数,但在整个解决方案的任何地方都不会调用辅助函数。这些字段永远不会在任何地方设置。

    此外,该值仅在本地端口被更改时才需要设置,但无论如何都会执行该代码块。

    删除这些行,只要您不更改本地端口,ale 重定向示例就可以正常工作,包括在更改本地 IP 时更改传出接口。如果确实需要更改本地端口,则必须使用 HlprWinSockCreatePortReservation 在 PROXY_DATA 中初始化适当的端口预留令牌变量。这必须在用户态下完成,所以设置过滤器时需要在服务中完成。

    免责声明:我认为这是唯一重要的更改,但是如果您在这里寻求解决此问题的方法,请知道在没有工作调试器的情况下跟踪此问题时,我更改了大量可笑的代码,因此可能还有更多在过去的几周里,我忘记了它。但我确实返回并验证该块始终被调用并且这些字段从未在原始中设置。

    【讨论】:

      【解决方案2】:

      我开始尝试使用 WFPSampler,还发现跟踪不起作用。奇怪的是,有很多额外的代码可以让 WPP 跟踪在多个操作系统上工作,但该示例没有捕获任何跟踪事件。于是我调试了一下,发现对nt!WmiTraceMessage的调用总是通过2作为TRACE_HANDLE。这似乎很糟糕。可以肯定地说,这并不是直接解读 WPP 宏,然后最终在 .vcxprog 文件中找到源。 WPP_COMPID_LEVEL_LOGGER(COMPID,LEVEL)=2 的定义不正确。当我在那里时,我还通过添加 2 将 DbgPrintEx 级别转换为匹配 Tace_Level,以便错误/警告与模型匹配。

      为 SysLib/WFPSampler 和 Sys/WFPSamplerCalloutDriver 完成以下步骤

      1. 打开项目
      2. 右键单击 WFPSamplerCalloutDriver
      3. 卸载项目
      4. 在 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. 在 WFPSamplerCalloutDriver 上单击鼠标右键
      3. 点击重新加载项目
      4. 重建

      我相信如果您采用这种使用 DbgPrintEx 作为跟踪功能的模式,您可以切换到 WPP,而无需编辑整个项目。但是,我仍然认为在您的程序中进行转换会更好。

      干杯,

      约翰

      【讨论】:

        猜你喜欢
        • 2012-07-17
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多