windows - WinDivert 重定向到代理

标签 windows proxy wfp

我正在尝试将所有 tcp 数据包重定向到我的本地代理以修改 html 内容(类似广告拦截器)。我想使用 WinDivert 但它似乎不起作用。

我像这样启动驱动程序:

handle = WinDivertOpen("outbound", WINDIVERT_LAYER_NETWORK, 0, 0);

然后在捕获和修改数据包时:

 if (ip_header != NULL && tcp_header != NULL) {

    //redirect to proxy
    if (ntohs(tcp_header->DstPort) == 80)
    {

       UINT32 dst_addr = ip_header->DstAddr;
       ip_header->DstAddr = ip_header->SrcAddr;
       ip_header->SrcAddr = dst_addr;
       tcp_header->DstPort = htons(PROXY);
       addr.Direction = DIVERT_DIRECTION_INBOUND;
    }

    else if (ntohs(tcphdr->SrcPort) == PROXY)
    {
        //  proxy to browser
        uint32_t dst_addr = iphdr->DstAddr;
        iphdr->DstAddr = iphdr->SrcAddr;
        iphdr->SrcAddr = dst_addr;
        tcphdr->SrcPort = htons(80);
        addr.Direction = DIVERT_DIRECTION_INBOUND;
    }
 WinDivertHelperCalcChecksums(packet, packet_len, 0);

 if (!WinDivertSend(handle, packet, packet_len , &addr, &send_len))
    {
        qWarning() << "warning: failed to reinject packet" << GetLastError() << send_len;
    } 

但在代理端,我看不到任何传入流量,并且网页未在网络浏览器中加载。

最佳答案

该代码片段会将出站(端口 HTTP)数据包转换为入站(端口 PROXY)数据包。这部分还可以。但目前没有任何东西可以处理反向路径。

例如,考虑 TCP 握手。该代码片段会将 (DstPort=80) SYN 数据包重定向到代理服务器,代理服务器将回复 (SrcPort=PROXY) SYN/ACK。然而,这个SYN/ACK并没有被上面的代码处理,并且会丢失。您需要添加代码以将出站 (SrcPort=PROXY) 数据包重定向到入站 (SrcPort=80) 数据包。

查看 TorWall 示例:https://github.com/basil00/TorWall/blob/082b7ff0fa86abfa2df480ece8cb31e25a29c1bc/tor_wall.c

编辑:另请参阅streamdump WinDivert 示例:https://github.com/basil00/Divert/blob/master/examples/streamdump/streamdump.c

关于windows - WinDivert 重定向到代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23995343/

相关文章:

proxy - 我可以使用 Fiddler 脚本修改 JSON 响应吗

windows - NDIS 协议(protocol)驱动程序(WinPcap 的 npf.sys)是否可以移植到 LWF 或 WFP?

java - 为什么 java 多播接收器无法在 Windows XP 上接收数据包?

java - 下载了 Eclipse 并下载了 Java SE Development Kit 7,但无法在 Eclipse 中运行新项目?

windows - 使用批处理循环遍历 CSV 文件 - 换行问题

android - Charles 代理在 SSL 连接方法上失败

java - WireMock 可以回放来自多个域的请求吗?

c++ - FwpmFilterAdd0失败(-2144206813)

redirect - WFP ALE_CONNECT_REDIRECT 图层 block 过滤器不起作用

java - 访问网络摄像头时发出通知的桌面程序