Я создаю свой подслой и присваиваю ему нулевой вес. Затем я создаю фильтры с выносками на следующих слоях:
- FWPM_LAYER_IPFORWARD_V4_DISCARD,
- FWPM_LAYER_INBOUND_IPPACKET_V4_DISCARD,
- FWPM_LAYER_OUTBOUND_IPPACKET_V4_DISCARD
- FWPM_LAYER_INBOUND_TRANSPORT_V4_DISCARD
- FWPM_LAYER_INBOUND_TRANSPORT_V4_DISCARD,
- FWPM_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD,
- FWPM_LAYER_STREAM_V4_DISCARD
- FWPM_LAYER_DATAGRAM_DATA_V4_DISCARD
- и СКИДКИ на ALE
Все эти фильтры назначены на моем подслое. Я не назначаю никакие условия фильтрам, потому что хочу перехватить все отброшенные пакеты.
Для тестирования проекта я использую «Программу», которая блокирует весь исходящий трафик и работает только на следующих слоях:
- FWPM_LAYER_INBOUND_IPPACKET_V4
- FWPM_LAYER_OUTBOUND_IPPACKET_V4
- FWPM_LAYER_IPFORWARD_V4
- и на соответствующих скидках.
По-моему, это должно работать так: «Программа» блокирует пакет, пакет отправляется на некоторые другие подуровни и, наконец, пакет отправляется на мой подуровень с проверочными фильтрами. Я использую функцию DbgPrint()
в функции классификации, чтобы определить, вызывается ли callout
. Когда я отправляю какой-то пакет, «Program» удаляет его, но мои функции классификации не запускаются.
Также у меня есть несколько вопросов:
Является ли моя мысль ясной, что все отброшенные пакеты пойдут, чтобы отбросить слои на всех подуровнях?
Если нет, как я могу проверить, был ли пакет отброшен другим фильтром на другом подуровне?
Могу ли я прикрепить свой собственный фильтр на чужой подслой?
Это мои функции для добавления и регистрации выносок:
NTSTATUS AddDefault(
LPCWSTR calloutName,
LPCWSTR calloutDescription,
const GUID calloutKey,
const GUID layerKey,
LPCWSTR filterName,
LPCWSTR filterDescription,
const GUID filterKey
)
{
NTSTATUS status;
FWPM_CALLOUT0 callout = { 0 };
FWPM_FILTER0 filter;
RtlZeroMemory(&filter, sizeof(FWPM_FILTER0));
callout.calloutKey = GUIDcallout;
callout.displayData.name = wstrName;
callout.displayData.description = wstrDescription;
callout.applicableLayer = GUIDlayer;
callout.providerKey = (GUID *)&GUIDprovider;
status = FwpmCalloutAdd0(g_hEngine, &callout, NULL, NULL);
if (!NT_SUCCESS(status))
{
PRINT_ERR("FwpmCalloutAdd0 failed", status);
goto Exit;
}
filter.providerKey = (GUID *)&GUIDprovider;
filter.displayData.name = wstrName;
filter.displayData.description = wstrDescription;
filter.layerKey = GUIDlayer;
filter.subLayerKey = GUIDsublayer;
filter.numFilterConditions = 0;
filter.filterCondition = NULL;
filter.action.type = FWP_ACTION_CALLOUT_INSPECTION;\
filter.action.calloutKey = GUIDcallout;
filter.filterKey = GUIDfilter;
filter.weight.type = FWP_EMPTY;
filter.flags = FWPM_FILTER_FLAG_NONE;
status = FwpmFilterAdd0(g_hEngine, &filter, NULL, NULL);
if (!NT_SUCCESS(status))
{
PRINT_ERR("FwpmFilterAdd0 failed", status);
goto Exit;
}
Exit:
return status;
}
NTSTATUS RegisterDefault(
PDEVICE_OBJECT pDevice,
const GUID calloutKey,
FWPS_CALLOUT_CLASSIFY_FN0 classifyFn,
FWPS_CALLOUT_FLOW_DELETE_NOTIFY_FN0 flowDeleteFn,
FWPS_CALLOUT_NOTIFY_FN0 notifyFn
)
{
FWPS_CALLOUT0 calloutInitData = { 0 };
calloutInitData.calloutKey = calloutKey;
calloutInitData.classifyFn = classifyFn;
calloutInitData.flowDeleteFn = flowDeleteFn;
calloutInitData.notifyFn = notifyFn;
return FwpsCalloutRegister0(pDevice, &calloutInitData, NULL);
}