private void Drop() { _dropTokenSource.Token.ThrowIfCancellationRequested(); try { _dropPacket = true; _dropPacketCount = _random.Next(2, 4); _dropHandler = WinDivertMethods.WinDivertOpen(string.Format(Resources.Template_PacketFilter, _port), WINDIVERT_LAYER.WINDIVERT_LAYER_NETWORK, 0, 0); OnMessage(Resources.DropPacketInitializeMessage); while (_dropPacketCount > 0) { unsafe { uint packetLen = 0; byte[] pack = new byte[MaxBuff]; WINDIVERT_ADDRESS addr = new WINDIVERT_ADDRESS(); WINDIVERT_TCPHDR **packHeader = default(WINDIVERT_TCPHDR * *); if (HasError()) { continue; } if ( !WinDivertMethods.WinDivertRecv(_dropHandler, pack, (uint)pack.Length, ref addr, ref packetLen)) { continue; } WinDivertMethods.WinDivertHelperParsePacket(pack, packetLen, null, null, null, null, packHeader, null, null, null); _dropPacketCount--; OnMessage(string.Format(Resources.Template_DropPacket, _dropPacketCount)); } } WinDivertMethods.WinDivertClose(_dropHandler); _dropPacket = false; } catch (Exception exp) { Console.WriteLine(Resources.ExceptionMessage, exp.Message); } }
public static unsafe extern bool WinDivertHelperParsePacket(byte *pPacket, uint packetLen, WINDIVERT_IPHDR **ppIpHdr, WINDIVERT_IPV6HDR **ppIpv6Hdr, WINDIVERT_ICMPHDR **ppIcmpHdr, WINDIVERT_ICMPV6HDR **ppIcmpv6Hdr, WINDIVERT_TCPHDR **ppTcpHdr, WINDIVERT_UDPHDR **ppUdpHdr, byte **ppData, uint *pDataLen);
public static unsafe extern bool WinDivertHelperParsePacket( [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pPacket, uint packetLen, WINDIVERT_IPHDR **ppIpHdr, WINDIVERT_IPV6HDR **ppIpv6Hdr, WINDIVERT_ICMPHDR **ppIcmpHdr, WINDIVERT_ICMPV6HDR **ppIcmpv6Hdr, WINDIVERT_TCPHDR **ppTcpHdr, WINDIVERT_UDPHDR **ppUdpHdr, byte **ppData, uint *pDataLen);
private void Steg() { try { _stegPacket = true; int breakCount = 1; _stegPacketCount = 1; _stegTokenSource.Token.ThrowIfCancellationRequested(); OnMessage(Resources.StegonographyInitializeMessage); unsafe { _stegHandler = WinDivertMethods.WinDivertOpen(string.Format(Resources.Template_DestinationFilter, _port), WINDIVERT_LAYER.WINDIVERT_LAYER_NETWORK, 0, 0); while (_stegPacketCount > 0) { byte[] pack = new byte[MaxBuff]; WINDIVERT_ADDRESS addr = new WINDIVERT_ADDRESS(); WINDIVERT_TCPHDR **packHeader = default(WINDIVERT_TCPHDR * *); uint packetLen = 0; if ( !WinDivertMethods.WinDivertRecv(_stegHandler, pack, (uint)pack.Length, ref addr, ref packetLen)) { continue; } WinDivertMethods.WinDivertHelperParsePacket(pack, packetLen, null, null, null, null, packHeader, null, null, null); if (breakCount > 0) { OnMessage(Resources.SendLegalDataMessage); } else { OnMessage(Resources.StegonographyAddedMessage); for (int i = 0; i < _stegWord.Length; i++) { pack[41 + i] = Convert.ToByte(_stegWord[i]); } } if (!WinDivertMethods.WinDivertSend(_stegHandler, pack, packetLen, ref addr, IntPtr.Zero)) { OnMessage(Resources.SendPacketError); } else { if (breakCount == 0) { _stegPacketCount--; } else { breakCount--; } } } WinDivertMethods.WinDivertClose(_stegHandler); } _stegPacket = false; } catch (Exception exp) { Console.WriteLine(Resources.ExceptionMessage, exp.Message); } }