Windows WinDivert重定向到代理服务器

Windows WinDivert重定向到代理服务器,windows,proxy,wfp,Windows,Proxy,Wfp,我正在尝试将所有tcp数据包重定向到本地代理以修改html内容(类似adblocker)。我想使用WinDivert,但它似乎不起作用 我这样启动驱动程序: handle = WinDivertOpen("outbound", WINDIVERT_LAYER_NETWORK, 0, 0); 然后在捕获和修改数据包时: if (ip_header != NULL && tcp_header != NULL) { //redirect to proxy if (

我正在尝试将所有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;
    } 
if(ip\u头!=NULL&&tcp\u头!=NULL){
//重定向到代理服务器
如果(ntohs(tcp_头->DstPort)==80)
{
UINT32 dst_addr=ip_头->DstAddr;
ip_头->DstAddr=ip_头->SrcAddr;
ip_头->srcadr=dst_addr;
tcp_头->DstPort=htons(代理);
addr.Direction=转向方向进站;
}
else if(ntohs(tcphdr->SrcPort)=代理)
{
//浏览器代理
uint32_t dst_addr=iphdr->DstAddr;
iphdr->DstAddr=iphdr->SrcAddr;
iphdr->SrcAddr=dst_addr;
tcphdr->SrcPort=htons(80);
addr.Direction=转向方向进站;
}
WinDiverThelperCalc校验和(数据包,数据包长度,0);
if(!WinDivertSend(句柄、数据包、数据包、地址和发送))
{

qWarning()代码段将出站(端口HTTP)数据包转换为入站(端口代理)数据包。此部分正常。但当前没有处理反向路径的内容

例如,考虑TCP握手。代码段将重定向一个(dSTPATH=80)SYN数据包到代理服务器,它将用一个(SRCPORT=代理)SYN/ACK进行应答。但是,这个SYN/ACK不是由上面的代码处理的,并且将丢失。您需要添加代码来重定向出站(SRCPORT=代理)包到入站(SRCtPATH=80)包。< /P> 请参见TorWall示例:


编辑:另请参阅
streamdump
WinDivert示例:

了解无限循环问题:一种解决方案是使用80以外的其他端口连接。例如,通过端口12345连接,然后让WinDivert应用程序在输出时将端口12345数据包转换为端口80数据包。对入站数据包执行反向转换@Basil:当使用SSL(或任何其他严重的传输安全协议)时,这种转换不起作用,因为客户端假定不同的目的地,并且校验和不匹配。是的,如果为true,则此转换将不起作用。可能有其他更复杂的解决方案(例如,连接跟踪和允许使用的连接表)“通过”?)理想情况下,Windows将支持来自Linux的类似于SO_标记的东西,这将使一切变得更容易。