#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;
}
// допустим, window.app.userID
ym(YOUR_COUNTER_ID, 'userParams', { userID: window.app.userID });