Beispiel #1
0
        private void Divert(DivertLayer layer)
        {
            const string filter = "tcp.DstPort == 80 or tcp.SrcPort == 80 or tcp.DstPort == 8082 or tcp.SrcPort == 8082";
            Diversion    diversion;

            try
            {
                diversion = Diversion.Open(filter, layer, -1000, 0);
                diversion.SetParam(DivertParam.QueueLength, 8192);
                diversion.SetParam(DivertParam.QueueTime, 2048);
            }
            catch (Exception e)
            {
                _fileLogger.Error(Tag, e.ToString());
                return;
            }

            if (!diversion.Handle.Valid)
            {
                _fileLogger.Error(Tag, $"Failed to open divert handle with error {Marshal.GetLastWin32Error()}");
                return;
            }



            while (_running)
            {
                var  buffer        = new byte[2048];
                var  address       = new Address();
                uint receiveLength = 0;
                if (!diversion.Receive(buffer, address, ref receiveLength))
                {
                    _fileLogger.Error(Tag, $"Failed to receive packet with error {Marshal.GetLastWin32Error()}");
                    continue;
                }

                var packet = new Packet(buffer, receiveLength);

                var hash = packet.GetHashCode();
                if (!KvStore.Connections.ContainsKey(hash))
                {
                    KvStore.Connections.TryAdd(hash, new Connection(diversion, address)
                    {
                        HashCode = hash
                    });
                }

                //if (!KvStore.ConnectionControllers.ContainsKey(hash))
                //    KvStore.ConnectionControllers.TryAdd(hash, new ConnectionController(packet,diversion));

                //Controlling Logic maybe
                KvStore.Connections[hash].Add(packet, address);
                //KvStore.ConnectionControllers[hash].Push(packet);
                //Monitoring Logic maybe
            }
        }
Beispiel #2
0
        public void Open(string filter, DivertLayer layer, short priority, DivertFlags flags)
        {
            if (String.IsNullOrWhiteSpace(filter))
            {
                throw new ArgumentNullException("filter");
            }

            ulong           m_flag  = Convert.ToUInt64(flags);
            WINDIVERT_LAYER m_layer = (WINDIVERT_LAYER)layer;

            _divert_handle = NativeMethods.WinDivertOpen(filter, m_layer, priority, m_flag);
            int lastWin32Error = Marshal.GetLastWin32Error();

            if (_divert_handle.IsInvalid)
            {
                switch (lastWin32Error)
                {
                case WinError.ERROR_FILE_NOT_FOUND:
                    throw new Exception("The driver files WinDivert32.sys or WinDivert64.sys were not found.");

                case WinError.ERROR_ACCESS_DENIED:
                    throw new Exception("You don't have sufficent privilege to use the driver.");

                case WinError.ERROR_INVALID_PARAMETER:
                    throw new Exception("Filter string, layer, priority, or flags parameters contain invalid values.");

                case WinError.ERROR_INVALID_IMAGE_HASH:
                    throw new Exception("The WinDivert32.sys or WinDivert64.sys driver does not have a valid digital signature.");

                case WinError.ERROR_DRIVER_BLOCKED:
                    throw new Exception("The driver is blocked from operating. This can happen for various reasons, such as interference from security software, or usage inside a virtualization environment that does not support drivers.");

                default:
                    throw new Exception("Failed to open WinDivert safe handle. Cause is unknown. Win32 Error is " + lastWin32Error);
                }
            }
        }