WinDivert重定向到代理

时间:2014-06-02 13:09:47

标签: windows proxy wfp

我正在尝试将所有tcp数据包重定向到我的本地代理以修改html内容(类似adblocker)。我想使用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;
    } 

但是在代理方面,我无法看到任何传入的流量和页面都没有在网络浏览器中加载。

1 个答案:

答案 0 :(得分:2)

代码段会将出站(端口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