2

すべての 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;
    } 

しかし、プロキシ側では、着信トラフィックが表示されず、ページが Web ブラウザーに読み込まれません。

4

1 に答える 1

2

コード スニペットは、アウトバウンド (ポート HTTP) パケットをインバウンド (ポート PROXY) パケットに変換します。この部分はOKです。しかし、現在、逆のパスを処理するものはありません。

たとえば、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

編集: streamdumpWinDivert サンプルも参照してください: https://github.com/basil00/Divert/blob/master/examples/streamdump/streamdump.c

于 2014-06-03T13:29:31.780 に答える