我是内核模式Windows驱动程序开发的新手,并且在从WFP标注样本中获取调试信息时遇到问题。我正在寻找更多的选择或提示我正在尝试的选项我做错了。
首先,我下载了WFP sampler并按照其中的说明进行操作。我使用的是Windows 8.1 x64主机和通过模拟串行电缆连接的Windows 7 x64目标。它们都是VirtualBox VM。
我正在调试的主要命令是
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)(可能重启):Pass"或者"等待重新连接..."重新启动目标并未在Debugger立即窗口中导致更多输出(“输出”窗口从未获得任何输出)。重新启动目标VM没有得到任何异常提示(我读过的一些内容暗示它应该)。设置调试器时重新连接复选框有时会导致它超过"等待重新连接..."提示,其他时候不需要。我设置了一些应该被击中的断点,包括一个位于每个分类函数顶部的断点,但没有一个被击中。
我尝试使用WinDbg进行调试,但是,坦率地说,我无法找到有关如何使用此工具的文档。我在目标机器上启动它并选择内核调试,本地。然后我得到一个提示,告诉我符号搜索路径无效,并且不知道我应该将它设置为什么。如果它允许我调试这些标注驱动程序,那么任何关于如何使用此工具而不仅仅是安装它的文档可能会有所帮助。
最后当然我尝试根据症状调试它,我发现检查标注没有做任何事情,尽管我可以告诉,而代理标注只是吃掉目标应用程序的所有流量,但有一点需要注意。需要注意的是,当我使用代理标注来定位firefox或chrome并尝试启动该应用程序时,它无法启动UI,并且无法从任务管理器中杀死部分启动的进程。
我认为行为可能是样本未能检查FwpsQueryPacketInjectionState的结果,但最好修改我可以弄清楚应该使用它似乎不会改变行为。
总之,我被困住了,需要指导吗?
答案 0 :(得分:2)
我开始尝试使用WFPSampler,并发现跟踪不起作用。奇怪的是,有很多额外的代码可以使WPP跟踪在多个操作系统上运行,但样本不会捕获任何跟踪事件。所以我调试了它并找到了对nt的调用!WmiTraceMessage总是传递2作为TRACE_HANDLE。这似乎很糟糕。安全地说,这并不是直接解读WPP宏,然后最终找到.vcxprog文件中的原点。 WPP_COMPID_LEVEL_LOGGER(COMPID,LEVEL)= 2的定义不正确。当我在那里时,我还将DbgPrintEx级别转换为匹配Tace_Level,添加2,因此错误/警告与模型匹配。
为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而无需编辑整个项目。但是,我仍然认为在你的程序中进行转换会更好。
干杯,
约翰
答案 1 :(得分:1)
不完全是这个问题的答案,我从来没有调试器工作,但解释为什么wfpsampler样本不能用于ALE层的代理。这个项目的最终目标。
在代理标注中有这些行(我认为在我的重构之前它们在 PerformProxySocketRedirection 方法中):
if (ipProtocol == IPPROTO_TCP)
pBindRequest1->portReservationToken = (pRedirectData)->pProxyData->tcpPortReservationToken;
else if (ipProtocol == IPPROTO_UDP)
pBindRequest1->portReservationToken = (pRedirectData)->pProxyData->udpPortReservationToken;
应该通过调用 CreatePersistentUdpPortReservation 或 CreatePersistentTcpPortReservation 来初始化udpPortReservationToken 或 tcpPortReservationToken ,这是在一个名为 HlprWinSockCreatePortReservation 的辅助函数,但从未在整个解决方案的任何位置调用辅助函数。这些领域永远不会在任何地方设置。
另外,只有在本地端口被更改时才需要设置该值,但无论如何都会执行该代码块。
删除这些行,只要您不更改本地端口,ale重定向示例就会按预期工作,包括在更改本地IP时更改传出接口。如果确实需要更改本地端口,则必须使用 HlprWinSockCreatePortReservation 在PROXY_DATA中初始化相应的端口预留令牌变量。这必须在用户模式下完成,因此您需要在设置过滤器时在服务中执行此操作。
免责声明:我认为这是唯一重要的变化,但是如果你在这里找到解决这个问题的方法,那么在没有工作调试器的情况下跟踪这个问题时我改变了大量的代码,所以可能会有更多的我忘记了过去几周的过程。但我确实回过头来验证该块总是被调用,并且那些字段从未在原始字段中设置。