Exemple #1
0
 public UDPPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isUDP())
         throw new Exception("Not a UDP packet!");
     start = base.LayerStart() + base.LayerLength();
 }
Exemple #2
0
 public ICMPv6Packet(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
     if (!isICMPv6())
         throw new Exception("Not an ICMPv6 packet!");
     start = base.LayerStart() + base.LayerLength();
     length = base.TotalLength;
 }
Exemple #3
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;
 }
Exemple #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);
 }
Exemple #5
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();
 }
Exemple #6
0
        public 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 = Configuration.ConfigurationManagement.Instance.ConfigurationPath;
                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-" + inter.Name + "-" + DateTime.Now.ToBinary() + ".pcap";
                pcaplog = new PcapFileWriter(f);

                INTERMEDIATE_BUFFER* PacketPointer;

                while (true)
                {
                    hEvent.WaitOne();
                    while (Ndisapi.ReadPacket(hNdisapi, ref Request))
                    {
                        PacketPointer = (INTERMEDIATE_BUFFER*)PacketBufferIntPtr;
                        Packet pkt = new EthPacket(PacketPointer).MakeNextLayerPacket();

                        if (pkt.Outbound)
                        {
                            inter.DataOut.AddBits(pkt.Length());
                        }
                        else
                        {
                            inter.DataIn.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool log = false;

                        if (this.Filtering)
                        {
                            for (int x = 0; x < Modules.Count; x++)
                            {
                                NDISModule fm = Modules.GetModule(x);
                                int pmr = fm.PacketMain(ref pkt);
                                if (pmr == null)
                                    continue;
                                if ((pmr & (int)PacketMainReturnType.LogPacket) == (int)PacketMainReturnType.LogPacket)
                                {
                                    log = true;
                                }
                                if ((pmr & (int)PacketMainReturnType.Drop) == (int)PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                            }
                        }

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

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

                        if (pkt.Outbound)
                        {
                            inter.DataOut.AddBits(pkt.Length());
                        }
                        else
                        {
                            inter.DataIn.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool log = false;

                        if (this.Filtering)
                        {
                            for (int x = 0; x < Modules.Count; x++)
                            {
                                NDISModule fm = Modules.GetModule(x);
                                int pmr = fm.PacketMain(ref pkt);
                                if (pmr == 0)
                                    continue;
                                if ((pmr & (int)PacketMainReturnType.LogPacket) == (int)PacketMainReturnType.LogPacket)
                                {
                                    log = true;
                                }
                                if ((pmr & (int)PacketMainReturnType.Drop) == (int)PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                            }
                        }

                        if (!drop && !DropAll)
                        {
                            if (pkt.Outbound)
                                Ndisapi.SendPacketToAdapter(hNdisapi, ref Request);
                            else
                                Ndisapi.SendPacketToMstcp(hNdisapi, ref Request);
                        }
                        if (log)
                            pcaplog.AddPacket(pkt.Data(), (int)pkt.Length());
                    }
                    hEvent.Reset();
                }
            }
            catch (Exception tae)
            {
                Marshal.FreeHGlobal(PacketBufferIntPtr);
            }
        }
Exemple #7
0
 public EthPacket(INTERMEDIATE_BUFFER* in_packet)
 {
     data = in_packet;
 }
Exemple #8
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);
 }
Exemple #9
0
 public EETHPacket(INTERMEDIATE_BUFFER* in_packet)
     : base(in_packet)
 {
 }