Задать вопрос
@ILoveAsm

Как перенаправлять весь траффик на определенный сайт через прокси сервер с помощью C/C++?

Доброго дня. Имеется задача перенаправлять весь (то есть со всей системы, всех приложений) траффик, который идет на определенный сайт, пусть google.com. Я пытался потыкать WinDivert, но не смог с ним ничего сделать ввиду незнания библиотеки. Возможно есть какие-то готовые примеры кода для этого? Пробовал использовать программы по типу Proxifier, но запросы обрабатываются медленно (не проблема моего прокси 100%), траффик не фильтруется и не бесплатно, поэтому хочется написать самому. На прокси имеется система входа по логину и паролю
  • Вопрос задан
  • 253 просмотра
Подписаться 3 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@AnKu_11
NAT-перехват и редирект целевых IP/портов на прокси
NAT-перенаправление всех TCP-пакетов заданного IP ...
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <windivert.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

#define PROXY_IP   "192.168.1.100"
#define PROXY_PORT 3128

int main()
{
    HANDLE handle;
    char filter[] =
      "outbound && (tcp.DstPort == 80 || tcp.DstPort == 443)";

    WINDIVERT_ADDRESS addr;
    UINT8 packet[0xFFFF];
    UINT  packetLen;

    handle = WinDivertOpen(filter, WINDIVERT_LAYER_NETWORK, 0, 0);
    if (!handle) {
        printf("WinDivertOpen failed: %d\n", GetLastError());
        return 1;
    }

    WSADATA wsa;
    WSAStartup(MAKEWORD(2,2), &wsa);

    printf("Перехват запущен...\n");
    while (TRUE) {
        if (!WinDivertRecv(handle, packet, sizeof(packet), &addr, &packetLen))
            continue;

        // Парсим заголовки
        PWINDIVERT_IPHDR  ipHdr  = (PWINDIVERT_IPHDR) packet;
        PWINDIVERT_TCPHDR tcpHdr = (PWINDIVERT_TCPHDR)((UINT8*)ipHdr + ipHdr->HdrLength * 4);

        // Подменяем на прокси
        inet_pton(AF_INET, PROXY_IP, &ipHdr->DstAddr);
        tcpHdr->DstPort = htons(PROXY_PORT);

        // Пересчёт контрольных сумм
        WinDivertHelperCalcChecksums(packet, packetLen, &addr, 0);

        // Отправляем изменённый пакет
        WinDivertSend(handle, packet, packetLen, &addr, NULL);
    }

    WinDivertClose(handle);
    WSACleanup();
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы