Проблемы с выносками на сбросить слои - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю свой подслой и присваиваю ему нулевой вес. Затем я создаю фильтры с выносками на следующих слоях:

  • 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» удаляет его, но мои функции классификации не запускаются.

Также у меня есть несколько вопросов:

  1. Является ли моя мысль ясной, что все отброшенные пакеты пойдут, чтобы отбросить слои на всех подуровнях?

  2. Если нет, как я могу проверить, был ли пакет отброшен другим фильтром на другом подуровне?

  3. Могу ли я прикрепить свой собственный фильтр на чужой подслой?

Это мои функции для добавления и регистрации выносок:

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);
}
...