我是内核模式Windows驱动程序开发的新手,并从WFP标注样本中获取debugging信息时遇到问题。 我正在寻找更多的选项或我正在做的错误与我一直在尝试的选项的提示。
首先,我下载了WFP采样器,并按照其描述中的说明进行操作。 我正在使用通过模拟串行电缆连接的Windows 8.1 x64主机和Windows 7 x64目标。 他们都是VirtualBox虚拟机。
我正在debugging的主要命令是
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是一个不同的networking接口的IP地址,而不是路由表中的stream量。 我还按照说明中的build议使用了以下检查命令:
WFPSampler.exe -s BASIC_PACKET_EXAMINATION -l FWPM_LAYER_INBOUND_IPPACKET_V4 -v
“netsh wfp show state”显示与预期图层相关联的标注和filter
但是,我从来没有从traceview收到任何消息,根据这些指示的最后一步。 Tracelog有类似的缺乏输出。 在驱动程序项目上启用或不启用WPP跟踪的情况下都是如此。 我也尝试了更高的冗长度,都没有效果。
此外,visual studio中的远程debugging器在“驱动程序安装操作(x64)(可能的重新启动):传递”或“等待重新连接…”时停止。重新启动目标不会在debugging器立即窗口中产生更多输出窗口从来没有得到任何输出)。 重新启动目标虚拟机没有得到任何不寻常的提示(我读的一些事情意味着它应该)。 设置debugging器时,重新连接checkbox有时会导致它不能通过“正在等待重新连接…”的提示,有时候则不需要。 我设置了一些应该被击中的断点,包括在每个分类函数的顶部,并且没有被击中。
我试图用WinDbg进行debugging,但坦率地说,我找不到有关如何使用此工具的文档。 我在目标机器上启动它,并select内核debugging,本地。 然后我得到一个提示,告诉我符号searchpath是无效的,不知道我应该设置它。 有关如何使用此工具的任何文档,而不是仅仅安装它,可能会帮助我debugging这些标注驱动程序。
最后,我试着根据症状进行debugging,我发现检查标注根本没有做任何事情,而代理标注只是吃掉目标应用程序的所有stream量,只有一个警告。 这个警告是,当我的目标火狐或铬代理标注,并尝试启动该应用程序无法启动一个用户界面和部分启动的过程不能被杀死任务pipe理器。
我认为,行为可能是由于样本未能检查FwpsQueryPacketInjectionState,但最好我能弄清楚,应该使用似乎并没有改变行为。
所以总之我卡住了,需要方向吗?
我开始尝试使用WFPSampler,并发现跟踪不起作用。 奇怪的是,还有很多额外的代码可以在多个操作系统上进行WPP跟踪,但是该示例没有捕获任何跟踪事件。 所以我调试了它,发现对nt!WmiTraceMessage的调用总是作为TRACE_HANDLE传递2。 这看起来很糟糕。 安全地说,这不是直接解读WPP宏,然后最终找到.vcxprog文件中的起源。 WPP_COMPID_LEVEL_LOGGER(COMPID,LEVEL)= 2的定义不正确。 当我在那里的时候,我也通过加入2来将DbgPrintEx Levels转换成与Tace_Level相匹配,以便匹配模型的错误/警告。
为SysLib / WFPSampler和Sys / WFPSamplerCalloutDriver完成以下步骤
类型:WppPreprpocessorDefinitions
在文件的两个位置更改此定义:
至:
<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>
我相信如果您采用这种使用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中初始化适当的端口预留标记变量。 这必须在用户模式下完成,因此您需要在设置过滤器时在服务中执行此操作。
免责声明:我认为这是唯一重要的变化,但是如果你在这里寻求解决这个问题的方法,就知道在没有工作的调试器的情况下跟踪这个问题,我改变了一个可笑的大量代码,所以可能会有更多的代码我忘了在过去几个星期的过程中。 但是我确实回去验证那个块总是被调用的,而且这些字段从来没有被设置在原来的位置。