WinDivert перенаправить на прокси

Я пытаюсь перенаправить все 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 ответ

Решение

Фрагмент кода преобразует исходящие (порт 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

Другие вопросы по тегам