【问题标题】:FiddlerCore: how to handle TCP traffic?FiddlerCore:如何处理 TCP 流量?
【发布时间】:2015-02-26 15:08:55
【问题描述】:

我想使用 fiddlercore 作为反向代理 - 解析 HTTP 请求并根据 HTTP 标头将它们重定向到另一个端口。但我还需要处理 TCP 请求并将它们重定向到另一个端口。可以使用 FiddlerCore 吗?不知何故确定它不是 HTTP 请求,只是 TCP。

我找到了名为 BeforeReturningError 的事件,但它没有被调用。 只有事件 BeforeSocketAccept 被触发,但这还不够。当 FiddlerCore 无法解析 HTTP 标头时,我没有发现任何其他可能调用的事件。

【问题讨论】:

    标签: http tcp fiddler fiddlercore


    【解决方案1】:

    Fiddler 和 FiddlerCore 仅处理 HTTP/HTTPS 流量。它们不是为处理原始 TCP 流量而设计的;您可以为此使用 netcat 之类的东西。

    【讨论】:

    • 我明白了,但是如果 FiddlerCore 无法解析 HTTP 标头会发生什么(如果它是原始 TCP 请求会发生)?我可以收到有关它的通知吗?我想处理请求不是 HTTP 的情况 - 并显示错误或类似的东西。
    • 如果请求或响应解析失败,Fiddler 将触发 BeforeReturningError 事件,响应指示请求或响应格式错误。
    • 谢谢!我有一个尝试建立 TCP 连接的客户端。我得到的只是 FiddlerCore 中的 SocketAccept 事件,客户端显示超时错误。我没有收到BeforeReturningError 事件。如何处理?
    • 如果你真的只有 SocketAccept 没有任何读取事件,这意味着客户端连接并等待服务器(Fiddler)发送一些东西,直到第一次超时(例如2 分钟或任何时间)。
    • 有什么方法可以解决这个问题吗?例如连接关闭时的某些事件或类似的事情
    【解决方案2】:

    要处理 TCP 数据包,您可以使用 Pcap 库。因此 fiddlercore 不适用于 TCP 或 UDP 数据包。

     private void PacketHandler(Packet packet)
        {
            this.count = ""; this.time = ""; this.source = ""; this.destination = ""; this.protocol = ""; this.length = "";
    
            this.tcpack = ""; this.tcpsec = ""; this.tcpnsec = ""; this.tcpsrc = ""; this.tcpdes = ""; this.udpscr = "";
    
            this.udpdes = ""; this.httpheader = ""; this.httpver = ""; this.httplen = ""; this.reqres = ""; this.httpbody = "";
    
            IpV4Datagram ip = packet.Ethernet.IpV4;
            TcpDatagram tcp = ip.Tcp;
            UdpDatagram udp = ip.Udp;
            HttpDatagram httpPacket=null;
    
    
            if (ip.Protocol.ToString().Equals("Tcp"))
            {
                httpPacket = tcp.Http;//Initialize http variable only if the packet was tcp
    
                if ((httpPacket.Header != null) && (!_tcp.Checked))
                {
                    protocol = "Http";
                    httpheader = httpPacket.Header.ToString();
                    count = packet.Count.ToString();
                    time = packet.Timestamp.ToString();
                    this.source = ip.Source.ToString();
                    this.destination = ip.Destination.ToString();
                    length = ip.Length.ToString();
                    httpver = httpPacket.Version.ToString();
                    httplen = httpPacket.Length.ToString();
                    httpbody = httpPacket.Body.ToString();
    
                    if (httpPacket.IsRequest)
                    {
                        reqres = "Request";
                    }
                    else
                    {
                        reqres = "Response";
                    }
                }
    
                else
                {
    
                    count = packet.Count.ToString();
                    time = packet.Timestamp.ToString();
                    this.source = ip.Source.ToString();
                    this.destination = ip.Destination.ToString();
                    length = ip.Length.ToString();
                    protocol = ip.Protocol.ToString();
    
                    tcpsrc = tcp.SourcePort.ToString();
                    tcpdes = tcp.DestinationPort.ToString();
                    tcpack = tcp.AcknowledgmentNumber.ToString();
                    tcpsec = tcp.SequenceNumber.ToString();
                    tcpnsec = tcp.NextSequenceNumber.ToString();
                }
    
    
            }
            else
            {
                if ((ip.Protocol.ToString().Equals("Udp")))
                {
                    count = packet.Count.ToString();
                    time = packet.Timestamp.ToString();
                    this.source = ip.Source.ToString();
                    this.destination = ip.Destination.ToString();
                    length = ip.Length.ToString();
                    protocol = ip.Protocol.ToString();
                    udpscr = udp.SourcePort.ToString();
                    udpdes = udp.DestinationPort.ToString();
                }
                else
                {
    
                    count = packet.Count.ToString();
                    time = packet.Timestamp.ToString();
                    this.source = ip.Source.ToString();
                    this.destination = ip.Destination.ToString();
                    length = ip.Length.ToString();
                    protocol = ip.Protocol.ToString();
    
                }
            }
    
    
            if (ip.Protocol.ToString().Equals("Tcp")&&(save.Checked))
            {
                int _source = tcp.SourcePort;
                int _destination = tcp.DestinationPort;
    
                if (tcp.PayloadLength != 0) //not syn or ack
                {
                    payload = new byte[tcp.PayloadLength];
                    tcp.Payload.ToMemoryStream().Read(payload, 0, tcp.PayloadLength);// read payload from 0 to length
                    if (_destination == 80)// request from server
                    {
                        Packet1 packet1 = new Packet1();
                        int i = Array.IndexOf(payload, (byte)32, 6);
                        byte[] t = new byte[i - 5];
                        Array.Copy(payload, 5, t, 0, i - 5);
                        packet1.Name = System.Text.ASCIIEncoding.ASCII.GetString(t);
    
                        if (!packets.ContainsKey(_source))
                            packets.Add(_source, packet1);
                    }
                    else
                        if (_source == 80)
                            if (packets.ContainsKey(_destination))
                            {
                                Packet1 packet1 = packets[_destination];
                                if (packet1.Data == null)
                                {
                                    if ((httpPacket.Header != null) && (httpPacket.Header.ContentLength != null))
                                    {
                                        packet1.Data = new byte[(uint)httpPacket.Header.ContentLength.ContentLength];
                                        Array.Copy(httpPacket.Body.ToMemoryStream().ToArray(), packet1.Data, httpPacket.Body.Length);
                                        packet1.Order = (uint)(tcp.SequenceNumber + payload.Length - httpPacket.Body.Length);
                                        packet1.Data_Length = httpPacket.Body.Length;
                                        for (int i = 0; i < packet1.TempPackets.Count; i++)
                                        {
                                            Temp tempPacket = packet1.TempPackets[i];
                                            Array.Copy(tempPacket.data, 0, packet1.Data, tempPacket.tempSeqNo - packet1.Order, tempPacket.data.Length);
                                            packet1.Data_Length += tempPacket.data.Length;
                                        }
                                    }
                                    else
                                    {
                                        Temp tempPacket = new Temp();
                                        tempPacket.tempSeqNo = (uint)tcp.SequenceNumber;
                                        tempPacket.data = new byte[payload.Length];
                                        Array.Copy(payload, tempPacket.data, payload.Length);
                                        packet1.TempPackets.Add(tempPacket);
                                    }
                                }
                                else if (packet1.Data_Length != packet1.Data.Length)
                                {
                                    Array.Copy(payload, 0, packet1.Data, tcp.SequenceNumber - packet1.Order, payload.Length);
    
                                    packet1.Data_Length += payload.Length;
                                }
    
                                if (packet1.Data != null)
                                    if (packet1.Data_Length == packet1.Data.Length)
                                    {
    
                                        using (BinaryWriter writer = new BinaryWriter(File.Open(@"D:\captured\" + Directory.CreateDirectory(Path.GetFileName(packet1.Name)), FileMode.Create)))
                                        {
                                            writer.Write(packet1.Data);
    
                                        }
    
                                        packets.Remove(_destination);
    
                                    }
                            }
                }
            }
    
    
        }
    

    此代码将对您有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2013-12-14
      • 2018-11-04
      • 2014-06-24
      • 2020-05-29
      • 2016-10-13
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多