2

我是内核模式 Windows 驱动程序开发的新手,并且在从 WFP 标注示例中获取调试信息时遇到问题。我正在寻找更多选项或提示我对我一直在尝试的选项做错了什么。

首先,我下载了WFP 采样器并按照说明中的说明进行操作。我正在使用通过模拟串行电缆连接的 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)(可能重新启动):通过”或“等待重新连接...”处停止,重新启动目标不会导致调试器立即窗口中的更多输出(输出窗口从未得到任何输出)。重新启动目标虚拟机没有得到任何异常提示(我读到的一些内容暗示它应该)。设置调试器时的重新连接复选框有时会导致它通过“等待重新连接...”提示,其他时候不需要它。我设置了许多应该命中的断点,包括每个分类函数顶部的一个断点,但没有一个被命中。

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

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

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

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

4

2 回答 2

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. 类型:WppPreprocesorDefinitions

  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 而无需编辑整个项目。但是,我仍然认为在您的程序中进行转换会更好。

干杯,

约翰

于 2015-01-21T15:30:49.497 回答
1

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

在 Proxy 标注中有这些行(我认为在我重构之前它们在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中初始化适当的端口保留令牌变量。这必须在用户模式下完成,因此您需要在设置过滤器时在服务中进行。

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

于 2014-11-06T01:01:29.167 回答