【问题标题】:WinDivert redirect to proxyWinDivert 重定向到代理
【发布时间】:2014-07-22 14:50:57
【问题描述】:

我正在尝试将所有 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;
    } 

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

【问题讨论】:

  • 对于无限循环问题:一种解决方案是使用 80 以外的其他端口进行连接。例如,通过端口 12345 连接,然后让 windivert 应用程序将端口 12345 数据包转换为端口 80 数据包出路。对入站数据包进行反向翻译。
  • @Basil:当使用 SSL(或任何其他重要的传输安全协议)时,这样的转换不起作用,因为客户端假定不同的目的地并且校验和不匹配。
  • 是的,如果为真,那么这将不起作用。可能还有其他更复杂的解决方案(例如,连接跟踪和允许“通过”的连接表?)理想情况下,Windows 会支持 Linux 中的 SO_MARK 之类的东西,这会使一切变得更容易。

标签: windows proxy wfp


【解决方案1】:

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

例如,考虑 TCP 握手。代码 sn-p 会将 (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

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2016-09-30
    • 2015-04-21
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2013-12-12
    • 2018-03-08
    相关资源
    最近更新 更多