Пример #1
0
 // accepts intermediate buff, checks if ICMP
 public ICMPPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isICMP())
         throw new Exception("Not an ICMP packet!");
     start = base.LayerStart() + base.LayerLength();
 }
Пример #2
0
 public DNSPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isDNS())
         throw new Exception("Not a DNS packet!");
     start = base.LayerStart() + base.LayerLength();
     length = Length() - start;
 }
Пример #3
0
 public ARPPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isARP())
         throw new Exception("Not an ARP packet!");
     start = base.LayerStart() + base.LayerLength();
     length = this.Length() - base.LayerLength();
 }
Пример #4
0
 public TCPPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isTCP())
         throw new Exception("Not a TCP packet!");
     start = base.LayerStart() + base.LayerLength();
     length = (uint)((data->m_IBuffer[start + 12] >> 4) * 4);
 }
Пример #5
0
 public IPPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isIP())
         throw new Exception("Not an IP packet!");
     start = base.LayerStart() + base.LayerLength();
     if (isIPv6())
         length = 40;
     else
         length = (uint)((data->m_IBuffer[start] & 0xf) * 4);
 }
Пример #6
0
        unsafe void ProcessLoop()
        {
            // Allocate and initialize packet structures
            ETH_REQUEST Request = new ETH_REQUEST();
            INTERMEDIATE_BUFFER PacketBuffer = new INTERMEDIATE_BUFFER();

            IntPtr PacketBufferIntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(PacketBuffer));
            try
            {
                win32api.ZeroMemory(PacketBufferIntPtr, Marshal.SizeOf(PacketBuffer));

                Request.hAdapterHandle = adapterHandle;
                Request.EthPacket.Buffer = PacketBufferIntPtr;

                modules = new ModuleList(this);

                modules.LoadExternalModules();

                modules.UpdateModuleOrder();

                string folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
                folder = folder + System.IO.Path.DirectorySeparatorChar + "firebwall";
                if (!System.IO.Directory.Exists(folder))
                    System.IO.Directory.CreateDirectory(folder);
                folder = folder + System.IO.Path.DirectorySeparatorChar + "pcapLogs";
                if (!System.IO.Directory.Exists(folder))
                    System.IO.Directory.CreateDirectory(folder);
                string f = folder + System.IO.Path.DirectorySeparatorChar + "blocked-" + this.InterfaceInformation.Name + "-" + PcapCreator.Instance.GetNewDate() + ".pcap";
                pcaplog = new PcapFileWriter(f);

                INTERMEDIATE_BUFFER* PacketPointer;

                while (true)
                {
                    hEvent.WaitOne();
                    while (Ndisapi.ReadPacket(hNdisapi, ref Request))
                    {
                        PacketPointer = (INTERMEDIATE_BUFFER*)PacketBufferIntPtr;
                        //PacketBuffer = (INTERMEDIATE_BUFFER)Marshal.PtrToStructure(PacketBufferIntPtr, typeof(INTERMEDIATE_BUFFER));

                        Packet pkt = new EthPacket(PacketPointer).MakeNextLayerPacket();

                        if (pkt.Outbound)
                        {
                            OutBandwidth.AddBits(pkt.Length());
                        }
                        else
                        {
                            InBandwidth.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool edit = false;

                        if (enabled)
                        {
                            for (int x = 0; x < modules.Count; x++)
                            {
                                FirewallModule fm = modules.GetModule(x);
                                PacketMainReturn pmr = fm.PacketMain(ref pkt);
                                if (pmr == null)
                                    continue;
                                if ((pmr.returnType & PacketMainReturnType.Log) == PacketMainReturnType.Log && pmr.logMessage != null)
                                {
                                    LogCenter.Instance.Push(pmr);
                                }
                                if ((pmr.returnType & PacketMainReturnType.Drop) == PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                                if ((pmr.returnType & PacketMainReturnType.Edited) == PacketMainReturnType.Edited)
                                {
                                    edit = true;
                                }
                            }
                        }

                        if (!drop)
                        {
                            if (pkt.Outbound)
                                Ndisapi.SendPacketToAdapter(hNdisapi, ref Request);
                            else
                                Ndisapi.SendPacketToMstcp(hNdisapi, ref Request);
                        }
                        else
                            pcaplog.AddPacket(pkt.Data(), (int)pkt.Length());
                    }

                    //OM NOM NOM PASTA!
                    while (processQueue.Count != 0)
                    {
                        Packet pkt = processQueue.Dequeue().MakeNextLayerPacket();

                        if (pkt.Outbound)
                        {
                            OutBandwidth.AddBits(pkt.Length());
                        }
                        else
                        {
                            InBandwidth.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool edit = false;

                        if (enabled)
                        {
                            for (int x = 0; x < modules.Count; x++)
                            {
                                FirewallModule fm = modules.GetModule(x);
                                PacketMainReturn pmr = fm.PacketMain(ref pkt);
                                if (pmr == null)
                                    continue;
                                if ((pmr.returnType & PacketMainReturnType.Log) == PacketMainReturnType.Log && pmr.logMessage != null)
                                {
                                    LogCenter.Instance.Push(pmr.Module, pmr.logMessage);
                                }
                                if ((pmr.returnType & PacketMainReturnType.Drop) == PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                                if ((pmr.returnType & PacketMainReturnType.Edited) == PacketMainReturnType.Edited)
                                {
                                    edit = true;
                                }
                            }
                        }

                        if (!drop)
                        {
                            if (pkt.Outbound)
                                Ndisapi.SendPacketToAdapter(hNdisapi, ref Request);
                            else
                                Ndisapi.SendPacketToMstcp(hNdisapi, ref Request);
                        }
                        else
                            pcaplog.AddPacket(pkt.Data(), (int)pkt.Length());
                    }
                    hEvent.Reset();
                }
            }
            catch (Exception tae)
            {
                Marshal.FreeHGlobal(PacketBufferIntPtr);
            }
        }
Пример #7
0
 public EETHPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
 }
Пример #8
0
 public EthPacket(INTERMEDIATE_BUFFER* in_packet)
 {
     data = in_packet;
 }