特点
WFP系统已经有数据过滤引擎的防火墙,没有规则,编写用户层的程序给WFP引擎设置规则,编写核心态的callout驱动处理WFP抓到的网络数据包做深度处理。比如加解密压缩解压缩之类在需要写驱动。
WFP分为
Layers:把规则分为若干组,GUID表示,子层https://docs.microsoft.com/zh-cn/windows/win32/fwp/basic-operation
Filters:用于处理包的一些规则集合
Shims:小垫片,解析网络堆栈中的流,包,事件,调用通过过滤引擎并根据规则评估数据。或者进一步调用callout,最后决定对包的最终处理。
Callouts函数:由驱动暴露的一组接口函数,负责进一步分析或者修改包,比如classify数据处理函数。可以返回一组permit,block,continue,defer,needmoredata等。
Classify:利用规则过滤包的过程,将包的各种属性与规则中断conditions进行比较。
WFP的整体流程
1.一个包进出入网络栈,网络栈就会查找和调用Shims,shim就会再某个特定的层触发一个分类程序(就是一个规则匹配)。
2.在这个分类程序中,过滤器会被匹配,匹配到了规则制定的结果会被执行。
3.如果制定了callout,就交给callout执行。
4.shim最后来执行这个结果。
WFP编写流程
FwpmEngineOpen()打开WFP引擎->FwpmTransactionBegin()开始第一次引擎事务处理->FwpmSubLayerAdd()->FwpsCalloutRegister()-向WFP系统添加Callout>FwpmFilterAdd()向WFP添加过滤器,就是添加规则->FwpmTransactionCommit()结束事务处理,关闭WFP引擎。
注册callout-R0注册
就是编写相关结构体,然后往结构体添加我们的处理函数,跟MiniFilter等类似
NTSTATUS status=STATUS_SUCCESS;
FWPS_CALLOUT0 sCallout={0};
sCallout.calloutKey=*calloutKey;//callout的guid key,guid generater生成的
sCallout.classifyFn=XxxClassify;//classify数据处理函数,里面变量中,处在不同层可以在里面的inFixedValue拿到不同数据,比如端口,ip等,inMetaValue是扩展数据,比如PID,路径等。LayerData包的原始数据指针,filter,lowContext,classifyOut是结果
sCallout.notifyFn=XxxNotify;//事件通知函数,通知callout发生的事件
sCallout.flowDeleteFn=XxxFlowDelete;//数据流结束时调用
status=FwpsCalloutRegister0(deviceObject,&sCallout,calloutld);//注册上面函数到系统中去
添加Callout-R0和R3皆可
FWPM_CALLOUT0 mCallout={0};
FWPM_DISPLAY_DATA0 displayData={0};
displayData.name=L"Transport Inspect ALEClassify Callout";
displayData.description=L"Intercepts inbound or outbound connect attempts";
mCallout.calloutKey=*calloutKey;//GUID
mCallout.displayData=displayData;
mCallout.applicableLayer=*layerKey;//添加到哪一层
status=FwpmCalloutAdd0(gEngineHandle,&mCallout,NULL,NULL);
注册filter-R0R3皆可
FWPM_FILTER0 filter={0};
FWPM_FILTER_CONDITION0 filterCondition[3]={0};//条件,比如IP多少之类的
UINT conditionIndex;
filter.layerKey=*layKey;//放到哪一层
filter.displayData.name=xxxx;
filterdisplayData.description=xxxx;
filter.action.type=FWP_ACTION_CALLOUT_TERMINATING;//就是交给callout处理。FWP_ACTION_BLOCK
filter.action.calloutKey=*calloutKey;
filter.filterCondition=filterConditions;
。。。。。、
filterCondition[conditionIndex].fieldKeyXXXX
.....
status=FwpmFilterAdd0();
.....
每一层Layer能下单filter:https://docs.microsoft.com/zh-cn/windows/win32/fwp/filtering-conditions-available-at-each-filtering-layer
WFP CALLout流程:
实现注册callout,添加callout,下规则。
demo
https://docs.microsoft.com/zh-cn/windows/win32/fwp/using-windows-filtering-platform
关于进程监控
WinDDK\7600\src\network\trans\msnmntr
INSPECT 开启了一个工作者线程检查包
WinDDK\7600\src\network\trans\inspect
总结
WFP程序思路
根据需要确定过滤的层,实现并注册callout,添加callout,添加filter规则,实现classifyFn函数