/// <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)); }
/// <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++; } } } }