WFP笔记

85 篇文章 6 订阅
83 篇文章 10 订阅

特点

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函数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值