// This will fire a IPv4FragmentReceived event private void FireIPv4FragmentReceived(IPv4Fragment fragment) { if (IPv4FragmentReceived != null) { IPv4FragmentReceived(fragment); } }
private void FireIPv4FragmentReceived(IPv4Fragment fragment) { if (this.FilterSet.IsWanted(fragment) && (this.IPv4FragmentReceived != null)) { this.IPv4FragmentReceived(fragment); } }
public void AddFragment(IPv4Fragment fragment) { if (this.m_FragmentHead == null) { this.m_FragmentHead = fragment; } else if (fragment.Offset < this.m_FragmentHead.Offset) { fragment.Next = this.m_FragmentHead; this.m_FragmentHead = fragment; } else { IPv4Fragment fragmentHead = this.m_FragmentHead; IPv4Fragment next = fragmentHead.Next; while ((fragmentHead != null) && (fragment.Offset > fragmentHead.Offset)) { next = fragmentHead; fragmentHead = fragmentHead.Next; } next.Next = fragment; fragment.Next = fragmentHead; } this.TestComplete(); }
public bool IsWanted(IPv4Fragment fragment) { bool flag = false; bool flag2 = false; bool flag3 = false; foreach (IAllowFilter filter in this.m_AllowList) { if (filter.AllowIPv4Fragment(fragment)) { flag2 = true; break; } } if (flag2) { return(true); } foreach (IDenyFilter filter2 in this.m_DenyList) { if (filter2.DenyIPv4Fragment(fragment)) { flag3 = true; break; } } if (!flag3) { flag = true; } return(flag); }
public void AddFragment(IPv4Fragment fragment) { if (FragmentHead_ == null) { FragmentHead_ = fragment; } else if (fragment.Offset < FragmentHead_.Offset) { fragment.Next = FragmentHead_; FragmentHead_ = fragment; } else { IPv4Fragment temp = FragmentHead_; IPv4Fragment last = temp.Next; while (temp != null && fragment.Offset > temp.Offset) { last = temp; temp = temp.Next; } last.Next = fragment; fragment.Next = temp; } TestComplete(); }
private void HandleIPv4Datagram(byte[] buffer) { int identification = 0; int num2 = 0; uint addr = 0; uint num4 = 0; int offset = 0; IPv4Datagram datagram = null; IPv4Fragment fragment = new IPv4Fragment(); fragment.MoreFlag = Sniffer.HeaderParser.ToByte(buffer, 50, 1) > 0; fragment.Offset = Sniffer.HeaderParser.ToInt(buffer, 0x33, 13) * 8; fragment.TTL = Sniffer.HeaderParser.ToInt(buffer, 0x40, 8); fragment.Length = Sniffer.HeaderParser.ToUShort(buffer, 0x10, 0x10); offset = Sniffer.HeaderParser.ToInt(buffer, 4, 4) * 4; fragment.SetData(buffer, offset, fragment.Length - offset); identification = Sniffer.HeaderParser.ToByte(buffer, 0x20, 0x10); num2 = Sniffer.HeaderParser.ToByte(buffer, 0x48, 8); addr = Sniffer.HeaderParser.ToUInt(buffer, 0x60, 0x20); num4 = Sniffer.HeaderParser.ToUInt(buffer, 0x80, 0x20); IPAddress source = IPAddress.Parse(IPv4Datagram.GetIPString(addr)); IPAddress dest = IPAddress.Parse(IPv4Datagram.GetIPString(num4)); datagram = this.m_Data.GetIPv4Datagram(identification, source, dest); if (datagram == null) { datagram = new IPv4Datagram(); datagram.Identification = identification; datagram.Source = source; datagram.Destination = dest; datagram.Protocol = num2; } datagram.AddFragment(fragment); if (!datagram.Complete) { this.m_Data.AddIPv4Datagram(datagram); this.FireIPv4FragmentReceived(fragment); } else { this.FireIPv4DatagramReceived(datagram); switch (datagram.Protocol) { case 6: this.HandleTcpPacket(datagram.Data, datagram.Source, datagram.Destination); break; case 0x11: this.HandleUdpDatagram(datagram.Data, datagram.Source, datagram.Destination); break; } if (datagram.WasFragmented()) { this.m_Data.RemoveIPv4Datagram(datagram); } } }
// TODO("Code TestComplete()") private void TestComplete() { bool done = false; IPv4Fragment fragment = FragmentHead_; int current = 0; while (fragment != null) { if (fragment.Next != null) { if (fragment.Offset == current) { fragment = fragment.Next; current += fragment.Length; } else { fragment = null; } } else { if (fragment.Offset == current && fragment.MoreFlag == false) { fragment = null; done = true; } else { fragment = null; } } } if (done) { CombineData(); } this.Complete_ = done; }
private void CombineData() { int length = 0; int offset = 0; IPv4Fragment temp = FragmentHead_; while (temp != null) { length += temp.Length; temp = temp.Next; } Data_ = new byte[length]; Length_ = length; temp = FragmentHead_; while (temp != null) { Array.Copy(temp.Data, 0, this.Data_, offset, temp.Length); offset += temp.Length; temp = temp.Next; } }
private void TestComplete() { bool flag = false; IPv4Fragment fragmentHead = this.m_FragmentHead; int num = 0; while (fragmentHead != null) { if (fragmentHead.Next != null) { if (fragmentHead.Offset == num) { fragmentHead = fragmentHead.Next; num += fragmentHead.Length; } else { fragmentHead = null; } } else if ((fragmentHead.Offset == num) && !fragmentHead.MoreFlag) { fragmentHead = null; flag = true; } else { fragmentHead = null; } } if (flag) { this.CombineData(); } this.m_Complete = flag; }
// Parses out an IPv4 Datagram. private void HandleIPv4Datagram(byte[] buffer) { int identification = 0; int protocol = 0; uint source = 0; uint dest = 0; int header_length = 0; IPv4Datagram datagram = null; IPAddress source_ip; IPAddress dest_ip; source = HeaderParser.ToUInt(buffer, 96, 32); dest = HeaderParser.ToUInt(buffer, 128, 32); source_ip = IPAddress.Parse(IPv4Datagram.GetIPString(source)); dest_ip = IPAddress.Parse(IPv4Datagram.GetIPString(dest)); if (isRelatedToThisCom(source_ip.ToString(), dest_ip.ToString())) { IPv4Fragment fragment = new IPv4Fragment(); fragment.MoreFlag = (HeaderParser.ToByte(buffer, 50, 1) > 0) ? true : false; fragment.Offset = HeaderParser.ToInt(buffer, 51, 13) * 8; fragment.TTL = HeaderParser.ToInt(buffer, 64, 8); fragment.Length = HeaderParser.ToUShort(buffer, 16, 16); header_length = HeaderParser.ToInt(buffer, 4, 4) * 4; fragment.SetData(buffer, header_length, fragment.Length - header_length); identification = HeaderParser.ToInt(buffer, 32, 16); protocol = HeaderParser.ToByte(buffer, 72, 8); // source = HeaderParser.ToUInt(buffer,96,32); // dest = HeaderParser.ToUInt(buffer,128,32); // source_ip = IPAddress.Parse(IPv4Datagram.GetIPString(source)); // dest_ip = IPAddress.Parse(IPv4Datagram.GetIPString(dest)); datagram = Data_.GetIPv4Datagram(identification, source_ip, dest_ip); if (datagram == null) { datagram = new IPv4Datagram(); datagram.IHL = HeaderParser.ToInt(buffer, 4, 4) * 4; datagram.TypeOfService = HeaderParser.ToInt(buffer, 8, 8); datagram.ReservedFlag = HeaderParser.ToInt(buffer, 48, 1); datagram.DontFragmentFlag = HeaderParser.ToInt(buffer, 49, 1); datagram.Identification = identification; datagram.TTL = HeaderParser.ToInt(buffer, 64, 8); datagram.Checksum = HeaderParser.ToInt(buffer, 80, 16); datagram.Source = source_ip; datagram.SourceName = DnsTable.GetName(source_ip.ToString()); datagram.DestinationName = DnsTable.GetName(dest_ip.ToString()); datagram.Destination = dest_ip; datagram.Protocol = protocol; if (datagram.IHL == 24) { datagram.Options = HeaderParser.ToInt(buffer, 160, 32); } } datagram.AddFragment(fragment); if (datagram.Complete) { datagram.SetPorts(); if (FilterManager.isAllowed(datagram.GetUpperProtocol(), datagram.SourceIP, datagram.DestinationIP, datagram.SPort, datagram.DPort)) { FireIPv4DatagramReceived(datagram); datagram.SetHeader(buffer); if (datagram.WasFragmented()) { Data_.RemoveIPv4Datagram(datagram); } } } else { Data_.AddIPv4Datagram(datagram); this.FireIPv4FragmentReceived(fragment); } } }