WinDivertredirect到代理

我试图将所有的tcp数据包redirect到我的本地代理修改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; } 

但在代理端,我不能看到任何传入的stream量和网页不加载在networking浏览器。

代码片段将出站(端口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