WFP筆記

特點

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章