如何使用windows wfp技术将udp信息转发到另一个程序中

计算机天才
·

接上文,proxifier目前不支持udp的转发 https://geeknote.net/tiancai/posts/2191

目前我还不会驱动层的ndis、wfp等类似网络过滤的技术。 但是我把这个问题给Chatgpt,它给了我一个答案,我决定试一下(如果用google去查的话,几乎搜不到wfp在应用层的应用,因为大多数人都是用这个写驱动的)。

答案如下

使用Windows Filtering Platform (WFP) 将UDP流量转发到另一个程序需要编写一个应用程序,该应用程序在用户模式和内核模式之间进行通信。本示例将介绍如何在用户模式中创建一个基本的WFP应用程序,用于监视和转发UDP流量。

安装Windows SDK:要使用WFP API,您需要安装Windows SDK。可以从官方网站下载并安装。

创建一个新的C++项目:在Visual Studio中创建一个新的C++控制台应用程序。将项目命名为UDPForwarder。

添加必要的头文件:

在UDPForwarder.cpp的顶部添加以下头文件:

#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <fwpmu.h>
#include <stdio.h>
#include <stdlib.h>
链接到必要的库:

在项目属性中,转到"链接器"->"输入",在"附加依赖项"中添加以下库:

Fwpuclnt.lib
Ws2_32.lib
初始化Winsock和WFP引擎句柄:

在main()函数中,添加以下代码来初始化Winsock和WFP:

int main()
{
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0)
    {
        printf("WSAStartup failed: %d\n", result);
        return 1;
    }

    HANDLE engineHandle = NULL;
    result = FwpmEngineOpen0(NULL, RPC_C_AUTHN_WINNT, NULL, NULL, &engineHandle);
    if (result != ERROR_SUCCESS)
    {
        printf("FwpmEngineOpen0 failed: %d\n", result);
        WSACleanup();
        return 1;
    }

    // ...
}
创建一个WFP层和子层:

在main()函数中,添加以下代码来创建一个WFP层和子层:

// Create a sublayer for our filter
FWPM_SUBLAYER0 sublayer;
memset(&sublayer, 0, sizeof(FWPM_SUBLAYER0));
sublayer.subLayerKey = { 0x6cbfd0fd, 0x9d38, 0x4e62, { 0x8d, 0x3b, 0x36, 0x9a, 0x3a, 0x7d, 0x4e, 0x1 } };
sublayer.displayData.name = L"UDP Forwarder Sublayer";
sublayer.displayData.description = L"Sublayer for UDP Forwarder";
sublayer.flags = 0;
sublayer.weight = FWP_EMPTY;

result = FwpmSubLayerAdd0(engineHandle, &sublayer, NULL);
if (result != ERROR_SUCCESS)
{
    printf("FwpmSubLayerAdd0 failed: %d\n", result);
    FwpmEngineClose0(engineHandle);
    WSACleanup();
    return 1;
}

// ...
创建一个WFP过滤器来监视UDP流量:

在main()函数中,添加以下代码来创建一个WFP过滤器以监视UDP流量:

// Create a filter for UDP traffic
FWPM_FILTER0 filter;
memset(&filter, 0, sizeof(FWPM_FILTER0));
filter.filterKey = { 0x6cbfd0fe, 0x9d38, 0x4e62, { 0x8d, 0x3b, 0x36, 0x9a, 0x3a, 0x7d, 0x4e, 0x2 } };
filter.displayData.name = L"UDP Forwarder Filter";
filter.displayData.description = L"Filter for UDP Forwarder";
filter.flags = FWPM_FILTER_FLAG_PERSISTENT;
filter.layerKey = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4;
filter.subLayerKey = sublayer.subLayerKey;
filter.weight.type = FWP_UINT8;
filter.weight.uint8 = 0

看了例子之后,再去google搜 usermode wfp ,或者从FwpmEngineOpen0 API函数入手就可以搜到一些用户模式的信息了。

但是Chatgpt给的答案应该是不对的。

https://www.apriorit.com/dev-blog/688-driver-controlling-and-monitoring-networks-with-user-mode-and-driver-mode-techniques

社区准则 博客 联系 社区 状态
主题