/// <summary>
 /// Extracts data from provided packet
 /// </summary>
 /// <param name="packet">Packet to extract data from</param>
 /// <returns>Returns new Packet object with extracted layers</returns>
 public INewPacket GetPacketByProtocol(IpV4Protocol protocol)
 {
     return(_packetFactory.GetPacketByProtocol(protocol));
 }
Exemple #2
0
        /// <summary>
        /// Intercepts and forwards packets to web
        /// </summary>
        public void InterceptAndForwardPackets(UserInputData userInput)
        {
            INewPacket packetToCopyFrom             = default;
            bool       isAutoModifyPackets          = false;
            bool       isFilterEnabled              = false;
            int        packetCountGoneThroughDevice = 0;
            int        selectedOutputDevice         = LetUserChooseInterfaceBeforeWorkingWithPackets();

            PacketDevice device = _allDevices[selectedOutputDevice - 1]; // - 1 because of array

            using (PacketCommunicator inputCommunicator = device.Open(65535, PacketDeviceOpenAttributes.Promiscuous, 1000))
            {
                if (inputCommunicator.DataLink.Kind != DataLinkKind.Ethernet)
                {
                    _userExperience.UserTextDisplayer.PrintTextAndExit("Only ethernet networks are supported");
                }

                using (PacketCommunicator outputCommunicator = device.Open(65535, PacketDeviceOpenAttributes.Promiscuous, 1000))
                {
                    if (!string.IsNullOrWhiteSpace(userInput.PacketFilterProtocol))
                    {
                        inputCommunicator.SetFilter(userInput.PacketFilterProtocol.ToLower());
                        outputCommunicator.SetFilter(userInput.PacketFilterProtocol.ToLower());
                        isFilterEnabled = true;
                    }

                    while (inputCommunicator.ReceivePacket(out Packet packet) != PacketCommunicatorReceiveResult.Eof)
                    {
                        if (packet == null)
                        {
                            continue;
                        }

                        if (packetCountGoneThroughDevice > 10) // for hint to be seen always, and not to cause too much mess in console
                        {
                            _userExperience.UserTextDisplayer.ClearConsole();
                            _userExperience.UserTextDisplayer.PrintText("-M to modify one packet");
                            _userExperience.UserTextDisplayer.PrintText("-A to automatically modify packets");
                            _userExperience.UserTextDisplayer.PrintText("-P to pause");
                            packetCountGoneThroughDevice = 0;
                        }

                        _userExperience.UserTextDisplayer.ShowPacketBaseInfo(packet);
                        if (Console.KeyAvailable) // if user pressed key, then does manipulation with packets
                        {
                            ConsoleKeyInfo choice = Console.ReadKey(true);
                            switch (choice.Key)
                            {
                            case ConsoleKey.A:     // modify every packet using user saved settings if filter is enabled
                                if (isFilterEnabled)
                                {
                                    packetToCopyFrom    = GetPacketFilledWithUserValuesToCopyFrom(packet.Ethernet.IpV4.Protocol, userInput.IsSendPacket);
                                    isAutoModifyPackets = (packetToCopyFrom != null);
                                }
                                else
                                {
                                    _userExperience.UserTextDisplayer.PrintText("NOTE: You can't automodify packets without protocol filtering");
                                }
                                break;

                            case ConsoleKey.M:     // modify one packet in normal way
                                packet = _packetFactory.GetPacketByProtocol(packet.Ethernet.IpV4.Protocol).ModifyLayers().BuildPacket(true, 0);
                                break;

                            case ConsoleKey.P:
                                _userExperience.UserTextDisplayer.PrintText("PAUSED");
                                _userExperience.UserInputHandler.WaitForUserToPressKey();
                                break;
                            }
                        }

                        if (isAutoModifyPackets)
                        {
                            Packet autoModifiedPacket = AutoModifyPacket(packet, packetToCopyFrom);
                            if (autoModifiedPacket != null)
                            {
                                packet = autoModifiedPacket;
                            }
                        }

                        if (userInput.IsUserWantsToSavePacket)
                        {
                            _fileHandler.TrySaveOnePacketToDisk(packet);
                        }

                        if (userInput.IsSendPacket)
                        {
                            outputCommunicator.SendPacket(packet);
                        }

                        packetCountGoneThroughDevice++;
                    }
                }
            }
        }