Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 28.42 KB | None | 0 0
  1. #region Using
  2. using System;
  3. using System.Collections;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. #endregion
  9. namespace IPv6LeakTest
  10. {
  11.     public class Program
  12.     {
  13.         #region Enums
  14.         public enum ADDRESS_FAMILIES : uint
  15.         {
  16.             AF_UNSPEC = 0,
  17.             AF_UNIX = 1,
  18.             AF_INET = 2,
  19.             AF_IMPLINK = 3,
  20.             AF_PUP = 4,
  21.             AF_CHAOS = 5,
  22.             AF_NS = 6,
  23.             AF_IPX = 6,
  24.             AF_ISO = 7,
  25.             AF_OSI = 7,
  26.             AF_ECMA = 8,
  27.             AF_DATAKIT = 9,
  28.             AF_CCITT = 10,
  29.             AF_SNA = 11,
  30.             AF_DECnet = 12,
  31.             AF_DLI = 13,
  32.             AF_LAT = 14,
  33.             AF_HYLINK = 15,
  34.             AF_APPLETALK = 16,
  35.             AF_NETBIOS = 17,
  36.             AF_VOICEVIEW = 18,
  37.             AF_FIREFOX = 19,
  38.             AF_UNKNOWN1 = 20,
  39.             AF_BAN = 21,
  40.             AF_ATM = 22,
  41.             AF_INET6 = 23,
  42.             AF_CLUSTER = 24,
  43.             AF_12844 = 25,
  44.             AF_IRDA = 26,
  45.             AF_NETDES = 28,
  46.             AF_TCNPROCESS = 29,
  47.             AF_TCNMESSAGE = 30,
  48.             AF_ICLFXBM = 31
  49.         }
  50.  
  51.         public enum ERROR : uint
  52.         {
  53.             ERROR_SUCCESS = 0,
  54.             ERROR_NO_DATA = 232,
  55.             ERROR_BUFFER_OVERFLOW = 111,
  56.             ERROR_INVALID_PARAMETER = 87
  57.         }
  58.  
  59.         public enum FLAGS : uint
  60.         {
  61.             GAA_FLAG_SKIP_UNICAST = 0x0001,
  62.             GAA_FLAG_SKIP_ANYCAST = 0x0002,
  63.             GAA_FLAG_SKIP_MULTICAST = 0x0004,
  64.             GAA_FLAG_SKIP_DNS_SERVER = 0x0008,
  65.             GAA_FLAG_INCLUDE_PREFIX = 0x0010,
  66.             GAA_FLAG_SKIP_FRIENDLY_NAME = 0x0020
  67.         }
  68.  
  69.         public enum IF_OPER_STATUS : uint
  70.         {
  71.             IfOperStatusUp = 1,
  72.             IfOperStatusDown,
  73.             IfOperStatusTesting,
  74.             IfOperStatusUnknown,
  75.             IfOperStatusDormant,
  76.             IfOperStatusNotPresent,
  77.             IfOperStatusLowerLayerDown,
  78.         }
  79.  
  80.         public enum IF_TYPE : uint
  81.         {
  82.             IF_TYPE_OTHER = 1,
  83.             IF_TYPE_REGULAR_1822 = 2,
  84.             IF_TYPE_HDH_1822 = 3,
  85.             IF_TYPE_DDN_X25 = 4,
  86.             IF_TYPE_RFC877_X25 = 5,
  87.             IF_TYPE_ETHERNET_CSMACD = 6,
  88.             IF_TYPE_IS088023_CSMACD = 7,
  89.             IF_TYPE_ISO88024_TOKENBUS = 8,
  90.             IF_TYPE_ISO88025_TOKENRING = 9,
  91.             IF_TYPE_ISO88026_MAN = 10,
  92.             IF_TYPE_STARLAN = 11,
  93.             IF_TYPE_PROTEON_10MBIT = 12,
  94.             IF_TYPE_PROTEON_80MBIT = 13,
  95.             IF_TYPE_HYPERCHANNEL = 14,
  96.             IF_TYPE_FDDI = 15,
  97.             IF_TYPE_LAP_B = 16,
  98.             IF_TYPE_SDLC = 17,
  99.             IF_TYPE_DS1 = 18,
  100.             IF_TYPE_E1 = 19,
  101.             IF_TYPE_BASIC_ISDN = 20,
  102.             IF_TYPE_PRIMARY_ISDN = 21,
  103.             IF_TYPE_PROP_POINT2POINT_SERIAL = 22,
  104.             IF_TYPE_PPP = 23,
  105.             IF_TYPE_SOFTWARE_LOOPBACK = 24,
  106.             IF_TYPE_EON = 25,
  107.             IF_TYPE_ETHERNET_3MBIT = 26,
  108.             IF_TYPE_NSIP = 27,
  109.             IF_TYPE_SLIP = 28,
  110.             IF_TYPE_ULTRA = 29,
  111.             IF_TYPE_DS3 = 30,
  112.             IF_TYPE_SIP = 31,
  113.             IF_TYPE_FRAMERELAY = 32,
  114.             IF_TYPE_RS232 = 33,
  115.             IF_TYPE_PARA = 34,
  116.             IF_TYPE_ARCNET = 35,
  117.             IF_TYPE_ARCNET_PLUS = 36,
  118.             IF_TYPE_ATM = 37,
  119.             IF_TYPE_MIO_X25 = 38,
  120.             IF_TYPE_SONET = 39,
  121.             IF_TYPE_X25_PLE = 40,
  122.             IF_TYPE_ISO88022_LLC = 41,
  123.             IF_TYPE_LOCALTALK = 42,
  124.             IF_TYPE_SMDS_DXI = 43,
  125.             IF_TYPE_FRAMERELAY_SERVICE = 44,
  126.             IF_TYPE_V35 = 45,
  127.             IF_TYPE_HSSI = 46,
  128.             IF_TYPE_HIPPI = 47,
  129.             IF_TYPE_MODEM = 48,
  130.             IF_TYPE_AAL5 = 49,
  131.             IF_TYPE_SONET_PATH = 50,
  132.             IF_TYPE_SONET_VT = 51,
  133.             IF_TYPE_SMDS_ICIP = 52,
  134.             IF_TYPE_PROP_VIRTUAL = 53,
  135.             IF_TYPE_PROP_MULTIPLEXOR = 54,
  136.             IF_TYPE_IEEE80212 = 55,
  137.             IF_TYPE_FIBRECHANNEL = 56,
  138.             IF_TYPE_HIPPIINTERFACE = 57,
  139.             IF_TYPE_FRAMERELAY_INTERCONNECT = 58,
  140.             IF_TYPE_AFLANE_8023 = 59,
  141.             IF_TYPE_AFLANE_8025 = 60,
  142.             IF_TYPE_CCTEMUL = 61,
  143.             IF_TYPE_FASTETHER = 62,
  144.             IF_TYPE_ISDN = 63,
  145.             IF_TYPE_V11 = 64,
  146.             IF_TYPE_V36 = 65,
  147.             IF_TYPE_G703_64K = 66,
  148.             IF_TYPE_G703_2MB = 67,
  149.             IF_TYPE_QLLC = 68,
  150.             IF_TYPE_FASTETHER_FX = 69,
  151.             IF_TYPE_CHANNEL = 70,
  152.             IF_TYPE_IEEE80211 = 71,
  153.             IF_TYPE_IBM370PARCHAN = 72,
  154.             IF_TYPE_ESCON = 73,
  155.             IF_TYPE_DLSW = 74,
  156.             IF_TYPE_ISDN_S = 75,
  157.             IF_TYPE_ISDN_U = 76,
  158.             IF_TYPE_LAP_D = 77,
  159.             IF_TYPE_IPSWITCH = 78,
  160.             IF_TYPE_RSRB = 79,
  161.             IF_TYPE_ATM_LOGICAL = 80,
  162.             IF_TYPE_DS0 = 81,
  163.             IF_TYPE_DS0_BUNDLE = 82,
  164.             IF_TYPE_BSC = 83,
  165.             IF_TYPE_ASYNC = 84,
  166.             IF_TYPE_CNR = 85,
  167.             IF_TYPE_ISO88025R_DTR = 86,
  168.             IF_TYPE_EPLRS = 87,
  169.             IF_TYPE_ARAP = 88,
  170.             IF_TYPE_PROP_CNLS = 89,
  171.             IF_TYPE_HOSTPAD = 90,
  172.             IF_TYPE_TERMPAD = 91,
  173.             IF_TYPE_FRAMERELAY_MPI = 92,
  174.             IF_TYPE_X213 = 93,
  175.             IF_TYPE_ADSL = 94,
  176.             IF_TYPE_RADSL = 95,
  177.             IF_TYPE_SDSL = 96,
  178.             IF_TYPE_VDSL = 97,
  179.             IF_TYPE_ISO88025_CRFPRINT = 98,
  180.             IF_TYPE_MYRINET = 99,
  181.             IF_TYPE_VOICE_EM = 100,
  182.             IF_TYPE_VOICE_FXO = 101,
  183.             IF_TYPE_VOICE_FXS = 102,
  184.             IF_TYPE_VOICE_ENCAP = 103,
  185.             IF_TYPE_VOICE_OVERIP = 104,
  186.             IF_TYPE_ATM_DXI = 105,
  187.             IF_TYPE_ATM_FUNI = 106,
  188.             IF_TYPE_ATM_IMA = 107,
  189.             IF_TYPE_PPPMULTILINKBUNDLE = 108,
  190.             IF_TYPE_IPOVER_CDLC = 109,
  191.             IF_TYPE_IPOVER_CLAW = 110,
  192.             IF_TYPE_STACKTOSTACK = 111,
  193.             IF_TYPE_VIRTUALIPADDRESS = 112,
  194.             IF_TYPE_MPC = 113,
  195.             IF_TYPE_IPOVER_ATM = 114,
  196.             IF_TYPE_ISO88025_FIBER = 115,
  197.             IF_TYPE_TDLC = 116,
  198.             IF_TYPE_GIGABITETHERNET = 117,
  199.             IF_TYPE_HDLC = 118,
  200.             IF_TYPE_LAP_F = 119,
  201.             IF_TYPE_V37 = 120,
  202.             IF_TYPE_X25_MLP = 121,
  203.             IF_TYPE_X25_HUNTGROUP = 122,
  204.             IF_TYPE_TRANSPHDLC = 123,
  205.             IF_TYPE_INTERLEAVE = 124,
  206.             IF_TYPE_FAST = 125,
  207.             IF_TYPE_IP = 126,
  208.             IF_TYPE_DOCSCABLE_MACLAYER = 127,
  209.             IF_TYPE_DOCSCABLE_DOWNSTREAM = 128,
  210.             IF_TYPE_DOCSCABLE_UPSTREAM = 129,
  211.             IF_TYPE_A12MPPSWITCH = 130,
  212.             IF_TYPE_TUNNEL = 131,
  213.             IF_TYPE_COFFEE = 132,
  214.             IF_TYPE_CES = 133,
  215.             IF_TYPE_ATM_SUBINTERFACE = 134,
  216.             IF_TYPE_L2_VLAN = 135,
  217.             IF_TYPE_L3_IPVLAN = 136,
  218.             IF_TYPE_L3_IPXVLAN = 137,
  219.             IF_TYPE_DIGITALPOWERLINE = 138,
  220.             IF_TYPE_MEDIAMAILOVERIP = 139,
  221.             IF_TYPE_DTM = 140,
  222.             IF_TYPE_DCN = 141,
  223.             IF_TYPE_IPFORWARD = 142,
  224.             IF_TYPE_MSDSL = 143,
  225.             IF_TYPE_IEEE1394 = 144,
  226.             IF_TYPE_RECEIVE_ONLY = 145,
  227.         }
  228.  
  229.         public enum IP_DAD_STATE : uint
  230.         {
  231.             IpDadStateInvalid = 0,
  232.             IpDadStateTentative,
  233.             IpDadStateDuplicate,
  234.             IpDadStateDeprecated,
  235.             IpDadStatePreferred,
  236.         }
  237.  
  238.         public enum IP_PREFIX_ORIGIN : uint
  239.         {
  240.             IpPrefixOriginOther = 0,
  241.             IpPrefixOriginManual,
  242.             IpPrefixOriginWellKnown,
  243.             IpPrefixOriginDhcp,
  244.             IpPrefixOriginRouterAdvertisement,
  245.         }
  246.  
  247.         public enum IP_SUFFIX_ORIGIN : uint
  248.         {
  249.             IpSuffixOriginOther = 0,
  250.             IpSuffixOriginManual,
  251.             IpSuffixOriginWellKnown,
  252.             IpSuffixOriginDhcp,
  253.             IpSuffixOriginLinkLayerAddress,
  254.             IpSuffixOriginRandom,
  255.         }
  256.  
  257.         public enum NET_IF_CONNECTION_TYPE : uint
  258.         {
  259.             NET_IF_CONNECTION_DEDICATED = 1,
  260.             NET_IF_CONNECTION_PASSIVE = 2,
  261.             NET_IF_CONNECTION_DEMAND = 3,
  262.             NET_IF_CONNECTION_MAXIMUM = 4
  263.         }
  264.  
  265.         public enum TUNNEL_TYPE : uint
  266.         {
  267.             TUNNEL_TYPE_NONE = 0,
  268.             TUNNEL_TYPE_OTHER = 1,
  269.             TUNNEL_TYPE_DIRECT = 2,
  270.             TUNNEL_TYPE_6TO4 = 11,
  271.             TUNNEL_TYPE_ISATAP = 13,
  272.             TUNNEL_TYPE_TEREDO = 14,
  273.             TUNNEL_TYPE_IPHTTPS = 15
  274.         }
  275.         #endregion
  276.         #region Constants
  277.         const string IPV6_BLACKHOLE_ROUTE_ADDR = "fe80::8";
  278.         const string IPV6_LINK_LOCAL_PREFIX = "fe80::";
  279.         const string TUN_BLACKHOLE_IPV6_ADDR = "fd00::1";
  280.  
  281.         const int MAX_ADAPTER_NAME_LENGTH = 256;
  282.         const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  283.         const int MAX_ADAPTER_ADDRESS_LENGTH = 8;
  284.         const int MAX_DHCPV6_DUID_LENGTH = 130;
  285.         const int MAX_TRIES = 3;
  286.  
  287.         const int INET6_ADDRSTRLEN = 65;
  288.         const uint WORKING_BUFFER_SIZE = 15000;
  289.         #endregion
  290.         #region Structures
  291.         [StructLayout(LayoutKind.Sequential)]
  292.         public struct GUID
  293.         {
  294.             uint Data1;
  295.             ushort Data2;
  296.             ushort Data3;
  297.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
  298.             byte[] Data4;
  299.         }
  300.  
  301.         [StructLayout(LayoutKind.Explicit, Size = 4)]
  302.         public struct in_addr
  303.         {
  304.             [FieldOffset(0)]
  305.             internal byte s_b1;
  306.             [FieldOffset(1)]
  307.             internal byte s_b2;
  308.             [FieldOffset(2)]
  309.             internal byte s_b3;
  310.             [FieldOffset(3)]
  311.             internal byte s_b4;
  312.  
  313.             [FieldOffset(0)]
  314.             internal ushort s_w1;
  315.             [FieldOffset(2)]
  316.             internal ushort s_w2;
  317.  
  318.             [FieldOffset(0)]
  319.             internal uint S_addr;
  320.  
  321.             internal uint s_addr
  322.             {
  323.                 get { return S_addr; }
  324.             }
  325.  
  326.             internal byte s_host
  327.             {
  328.                 get { return s_b2; }
  329.             }
  330.  
  331.             internal byte s_net
  332.             {
  333.                 get { return s_b1; }
  334.             }
  335.  
  336.             internal ushort s_imp
  337.             {
  338.                 get { return s_w2; }
  339.             }
  340.  
  341.             internal byte s_impno
  342.             {
  343.                 get { return s_b4; }
  344.             }
  345.  
  346.             internal byte s_lh
  347.             {
  348.                 get { return s_b3; }
  349.             }
  350.         }
  351.  
  352.         [StructLayout(LayoutKind.Explicit, Size = 16)]
  353.         public struct in6_addr
  354.         {
  355.             [FieldOffset(0)]
  356.             internal byte Byte_0;
  357.             [FieldOffset(1)]
  358.             internal byte Byte_1;
  359.             [FieldOffset(2)]
  360.             internal byte Byte_2;
  361.             [FieldOffset(3)]
  362.             internal byte Byte_3;
  363.  
  364.             [FieldOffset(4)]
  365.             internal byte Byte_4;
  366.             [FieldOffset(5)]
  367.             internal byte Byte_5;
  368.             [FieldOffset(6)]
  369.             internal byte Byte_6;
  370.             [FieldOffset(7)]
  371.             internal byte Byte_7;
  372.  
  373.             [FieldOffset(8)]
  374.             internal byte Byte_8;
  375.             [FieldOffset(9)]
  376.             internal byte Byte_9;
  377.             [FieldOffset(10)]
  378.             internal byte Byte_10;
  379.             [FieldOffset(11)]
  380.             internal byte Byte_11;
  381.  
  382.             [FieldOffset(12)]
  383.             internal byte Byte_12;
  384.             [FieldOffset(13)]
  385.             internal byte Byte_13;
  386.             [FieldOffset(14)]
  387.             internal byte Byte_14;
  388.             [FieldOffset(15)]
  389.             internal byte Byte_16;
  390.  
  391.             [FieldOffset(0)]
  392.             internal short Word_0;
  393.             [FieldOffset(2)]
  394.             internal short Word_1;
  395.             [FieldOffset(4)]
  396.             internal short Word_2;
  397.             [FieldOffset(6)]
  398.             internal short Word_3;
  399.  
  400.             [FieldOffset(8)]
  401.             internal short Word_4;
  402.             [FieldOffset(10)]
  403.             internal short Word_5;
  404.             [FieldOffset(12)]
  405.             internal short Word_6;
  406.             [FieldOffset(14)]
  407.             internal short Word_7;
  408.         }
  409.  
  410.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  411.         public struct IP_ADDRESS_STRING
  412.         {
  413.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
  414.             public string Address;
  415.         }
  416.  
  417.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  418.         public struct IP_ADDR_STRING
  419.         {
  420.             public IntPtr Next;
  421.             public IP_ADDRESS_STRING IpAddress;
  422.             public IP_ADDRESS_STRING Mask;
  423.             public Int32 Context;
  424.         }
  425.  
  426.         [StructLayout(LayoutKind.Sequential)]
  427.         public struct IP_ADAPTER_ADDRESSES
  428.         {
  429.             public UInt64 Alignment;
  430.             public IntPtr Next;
  431.             public IntPtr AdapterName;
  432.             public IntPtr FirstUnicastAddress;
  433.             public IntPtr FirstAnycastAddress;
  434.             public IntPtr FirstMulticastAddress;
  435.             public IntPtr FirstDnsServerAddress;
  436.             [MarshalAs(UnmanagedType.LPWStr)]
  437.             public string DnsSuffix;
  438.             [MarshalAs(UnmanagedType.LPWStr)]
  439.             public string Description;
  440.             [MarshalAs(UnmanagedType.LPWStr)]
  441.             public string FriendlyName;
  442.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]
  443.             public byte[] PhysicalAddress;
  444.             public uint PhysicalAddressLength;
  445.             public uint Flags;
  446.             public uint Mtu;
  447.             public IF_TYPE IfType;
  448.             public IF_OPER_STATUS OperStatus;
  449.             uint Ipv6IfIndex;
  450.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
  451.             public uint[] ZoneIndices;
  452.             public IntPtr FirstPrefix;
  453.  
  454.             // Items added for Vista
  455.             // May need to be removed on Windows versions below Vista to work properly (?)
  456.             public UInt64 TrasmitLinkSpeed;
  457.             public UInt64 ReceiveLinkSpeed;
  458.             public IntPtr FirstWinsServerAddress;
  459.             public IntPtr FirstGatewayAddress;
  460.             public uint Ipv4Metric;
  461.             public uint Ipv6Metric;
  462.             public UInt64 Luid;
  463.             public SOCKET_ADDRESS Dhcpv4Server;
  464.             public uint CompartmentId;
  465.             public GUID NetworkGuid;
  466.             public NET_IF_CONNECTION_TYPE ConnectionType;
  467.             public TUNNEL_TYPE TunnelType;
  468.             public SOCKET_ADDRESS Dhcpv6Server;
  469.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_DHCPV6_DUID_LENGTH)]
  470.             public byte[] Dhcpv6ClientDuid;
  471.             public uint Dhcpv6ClientDuidLength;
  472.             public uint Dhcpv6Iaid;
  473.             public uint FirstDnsSuffix;
  474.         }
  475.  
  476.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  477.         public struct IP_ADAPTER_INFO
  478.         {
  479.             public IntPtr Next;
  480.             public Int32 ComboIndex;
  481.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_NAME_LENGTH + 4)]
  482.             public string AdapterName;
  483.             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]
  484.             public string AdapterDescription;
  485.             public UInt32 AddressLength;
  486.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]
  487.             public byte[] Address;
  488.             public Int32 Index;
  489.             public UInt32 Type;
  490.             public UInt32 DhcpEnabled;
  491.             public IntPtr CurrentIpAddress;
  492.             public IP_ADDR_STRING IpAddressList;
  493.             public IP_ADDR_STRING GatewayList;
  494.             public IP_ADDR_STRING DhcpServer;
  495.             public bool HaveWins;
  496.             public IP_ADDR_STRING PrimaryWinsServer;
  497.             public IP_ADDR_STRING SecondaryWinsServer;
  498.             public Int32 LeaseObtained;
  499.             public Int32 LeaseExpires;
  500.         }
  501.  
  502.         [StructLayout(LayoutKind.Sequential)]
  503.         public struct IP_ADAPTER_UNICAST_ADDRESS
  504.         {
  505.             public UInt64 Alignment;
  506.             public IntPtr Next;
  507.             public SOCKET_ADDRESS Address;
  508.             public IP_PREFIX_ORIGIN PrefixOrigin;
  509.             public IP_SUFFIX_ORIGIN SuffixOrigin;
  510.             public IP_DAD_STATE DadState;
  511.             public uint ValidLifetime;
  512.             public uint PreferredLifetime;
  513.             public uint LeaseLifetime;
  514.         }
  515.  
  516.         [StructLayout(LayoutKind.Sequential)]
  517.         public struct SOCKADDR
  518.         {
  519.             public ushort sa_family;
  520.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]
  521.             public byte[] sa_data;
  522.         }
  523.  
  524.         [StructLayout(LayoutKind.Explicit, Size = 28)]
  525.         public struct sockaddr_in6
  526.         {
  527.             [FieldOffset(0)]
  528.             internal ADDRESS_FAMILIES sin6_family;
  529.             [FieldOffset(2)]
  530.             internal ushort sin6_port;
  531.             [FieldOffset(4)]
  532.             internal uint sin6_flowinfo;
  533.             [FieldOffset(8)]
  534.             internal in6_addr sin6_addr;
  535.             [FieldOffset(24)]
  536.             internal uint sin6_scope_id;
  537.         }
  538.  
  539.         [StructLayout(LayoutKind.Sequential)]
  540.         public struct SOCKET_ADDRESS
  541.         {
  542.             public IntPtr lpSockAddr; //LPSOCKADDR
  543.             public int iSockaddrLength;
  544.         }
  545.         #endregion
  546.         #region External Methods
  547.         [DllImport("iphlpapi.dll")]
  548.         private static extern ERROR GetAdaptersAddresses(uint Family, uint Flags, IntPtr Reserved, IntPtr pAdapterAddresses, ref uint pOutBufLen);
  549.  
  550.         [DllImport("iphlpapi.dll", CharSet = CharSet.Ansi)]
  551.         private static extern ERROR GetAdaptersInfo(IntPtr pAdapterInfo, ref Int64 pBufOutLen);
  552.  
  553.         [DllImport("Ws2_32.dll", CharSet = CharSet.Unicode, EntryPoint = "InetNtopW")]
  554.         public static extern uint InetNtop(ADDRESS_FAMILIES Family, ref in_addr pAddr, StringBuilder pStringBuf, int StringBufSize);
  555.  
  556.         [DllImport("Ws2_32.dll", CharSet = CharSet.Unicode, EntryPoint = "InetNtopW")]
  557.         public static extern uint InetNtop(ADDRESS_FAMILIES Family, ref in6_addr pAddr, StringBuilder pStringBuf, int StringBufSize);
  558.  
  559.         [DllImport("Ws2_32.dll", CharSet = CharSet.Unicode, EntryPoint = "InetPtonW")]
  560.         public static extern uint InetPton(ADDRESS_FAMILIES Family, string pszAddrString, ref in_addr pAddrBuf);
  561.  
  562.         [DllImport("Ws2_32.dll", CharSet = CharSet.Unicode, EntryPoint = "InetPtonW")]
  563.         public static extern uint InetPton(ADDRESS_FAMILIES Family, string pszAddrString, ref in6_addr pAddrBuf);
  564.         #endregion
  565.         #region Static Methods
  566.         private static void Execute(string cmd)
  567.         {
  568.             Console.WriteLine("Executing command: " + cmd);
  569.  
  570.             Process p = new Process();
  571.             p.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.System) + Path.DirectorySeparatorChar + "cmd.exe";
  572.             p.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);
  573.             p.StartInfo.Arguments = cmd;
  574.             p.StartInfo.UseShellExecute = false;
  575.             p.StartInfo.Verb = "runas";
  576.             p.Start();
  577.         }
  578.  
  579.         // Get info for all network adapters
  580.         private static Adapter[] GetAdaptersInfo()
  581.         {
  582.             Adapter[] adaptersList;
  583.             ArrayList adapters = new ArrayList();
  584.             long structSize = Marshal.SizeOf(typeof(IP_ADAPTER_INFO));
  585.             IntPtr pArray = Marshal.AllocHGlobal((int)structSize);
  586.             ERROR retVal = GetAdaptersInfo(pArray, ref structSize);
  587.  
  588.             if (retVal.Equals(ERROR.ERROR_BUFFER_OVERFLOW))
  589.             {
  590.                 // Buffer was too small, reallocate the correct size for the buffer.
  591.                 pArray = Marshal.ReAllocHGlobal(pArray, new IntPtr(structSize));
  592.                 retVal = GetAdaptersInfo(pArray, ref structSize);
  593.             }
  594.  
  595.             if (retVal.Equals(ERROR.ERROR_SUCCESS))
  596.             {
  597.                 // Call Succeeded
  598.                 IntPtr pEntry = pArray;
  599.  
  600.                 do
  601.                 {
  602.                     // Retrieve the adapter info from the memory address
  603.                     IP_ADAPTER_INFO entry = (IP_ADAPTER_INFO)Marshal.PtrToStructure(pEntry, typeof(IP_ADAPTER_INFO));
  604.  
  605.                     Adapter adapter = new Adapter();
  606.                     adapter.Index = entry.Index;
  607.                     adapter.Name = entry.AdapterName;
  608.                     adapter.Description = entry.AdapterDescription;
  609.                     adapter.IP = entry.IpAddressList.IpAddress.Address;
  610.  
  611.                     // MAC Address (data is in a byte[])
  612.                     string tmpString = string.Empty;
  613.                     for (int i = 0; i < entry.AddressLength; i++)
  614.                     {
  615.                         tmpString += string.Format("{0:X2}", entry.Address);
  616.                     }
  617.  
  618.                     adapter.MacAddress = tmpString;
  619.                     adapters.Add(adapter);
  620.  
  621.                     // Get next adapter (if any)
  622.                     pEntry = entry.Next;
  623.                 }
  624.                 while (pEntry != IntPtr.Zero);
  625.  
  626.                 Marshal.FreeHGlobal(pArray);
  627.  
  628.                 adaptersList = new Adapter[adapters.Count];
  629.                 adapters.CopyTo(adaptersList);
  630.             }
  631.             else
  632.             {
  633.                 adaptersList = new Adapter[0];
  634.  
  635.                 Marshal.FreeHGlobal(pArray);
  636.  
  637.                 throw new InvalidOperationException("GetAdaptersInfo failed with: " + retVal.ToString());
  638.             }
  639.  
  640.             return adaptersList;
  641.         }
  642.  
  643.         // Get TUN interface ID
  644.         private static int GetTUNInterfaceID()
  645.         {
  646.             foreach (Adapter adapter in GetAdaptersInfo())
  647.             {
  648.                 if (adapter.Description.Contains("TAP-Windows Adapter V9")) return adapter.Index;
  649.             }
  650.  
  651.             return 0;
  652.         }
  653.  
  654.         // set IPv6 IP address for TUN
  655.         private static void SetIPv6AddrToTun(int tunIfIndex)
  656.         {
  657.             Execute("netsh interface ipv6 add address interface=" + tunIfIndex.ToString() + " " + TUN_BLACKHOLE_IPV6_ADDR);
  658.         }
  659.  
  660.         // set IPv6 blockhole route
  661.         private static void SetIPv6BlackHoleRoute(int tunIfIndex)
  662.         {
  663.             IntPtr addresses = IntPtr.Zero;
  664.             ERROR retVal = ERROR.ERROR_SUCCESS;
  665.             uint outBufLen = WORKING_BUFFER_SIZE;
  666.             int iterations = 0;
  667.  
  668.             do
  669.             {
  670.                 addresses = Marshal.AllocHGlobal((int)outBufLen);
  671.                 if (addresses.Equals(IntPtr.Zero))
  672.                 {
  673.                     Console.WriteLine("Memory allocation failed for IP_ADAPTER_ADDRESSES struct");
  674.                     return;
  675.                 }
  676.  
  677.                 retVal = GetAdaptersAddresses((uint)ADDRESS_FAMILIES.AF_INET6, (uint)FLAGS.GAA_FLAG_INCLUDE_PREFIX, IntPtr.Zero, addresses, ref outBufLen);
  678.  
  679.                 if (retVal.Equals(ERROR.ERROR_BUFFER_OVERFLOW))
  680.                 {
  681.                     Marshal.FreeHGlobal(addresses);
  682.                     addresses = IntPtr.Zero;
  683.                 }
  684.                 else break;
  685.  
  686.                 iterations++;
  687.             }
  688.             while ((retVal.Equals(ERROR.ERROR_BUFFER_OVERFLOW)) && (iterations < MAX_TRIES));
  689.  
  690.             if (retVal.Equals(ERROR.ERROR_SUCCESS))
  691.             {
  692.                 while (!addresses.Equals(IntPtr.Zero))
  693.                 {
  694.                     // If successful, output some information from the data we received
  695.                     IP_ADAPTER_ADDRESSES currAddresses = (IP_ADAPTER_ADDRESSES)Marshal.PtrToStructure(addresses, typeof(IP_ADAPTER_ADDRESSES));
  696.                     IntPtr unicast = currAddresses.FirstUnicastAddress;
  697.  
  698.                     while (!unicast.Equals(IntPtr.Zero))
  699.                     {
  700.                         IP_ADAPTER_UNICAST_ADDRESS unicastAddresses = (IP_ADAPTER_UNICAST_ADDRESS)Marshal.PtrToStructure(unicast, typeof(IP_ADAPTER_UNICAST_ADDRESS));
  701.  
  702.                         SetBlackHoleRoute(unicastAddresses.Address, tunIfIndex);
  703.  
  704.                         unicast = unicastAddresses.Next;
  705.                     }
  706.  
  707.                     addresses = currAddresses.Next;
  708.                 }
  709.             }
  710.  
  711.             if (!addresses.Equals(IntPtr.Zero))
  712.             {
  713.                 Marshal.FreeHGlobal(addresses);
  714.                 addresses = IntPtr.Zero;
  715.             }
  716.         }
  717.  
  718.         // set blackhole route per each IPv6 interface
  719.         private static void SetBlackHoleRoute(SOCKET_ADDRESS sockAddr, int tunIfIndex)
  720.         {
  721.             sockaddr_in6 mask_addr6 = new sockaddr_in6();
  722.             sockaddr_in6 subnet_addr6 = new sockaddr_in6();
  723.             StringBuilder szIPv6Addr = new StringBuilder();
  724.             StringBuilder szSubnetIPv6Addr = new StringBuilder();
  725.  
  726.             SOCKADDR socketAddr = (SOCKADDR)Marshal.PtrToStructure(sockAddr.lpSockAddr, typeof(SOCKADDR));
  727.  
  728.             if ((uint)socketAddr.sa_family != (uint)ADDRESS_FAMILIES.AF_INET6) return;
  729.  
  730.             sockaddr_in6 addr6 = (sockaddr_in6)Marshal.PtrToStructure(sockAddr.lpSockAddr, typeof(sockaddr_in6));
  731.  
  732.             InetNtop(ADDRESS_FAMILIES.AF_INET6, ref addr6.sin6_addr, szIPv6Addr, INET6_ADDRSTRLEN);
  733.  
  734.             string ipv6 = szIPv6Addr.ToString();
  735.  
  736.             if (ipv6.StartsWith(IPV6_LINK_LOCAL_PREFIX) ||
  737.                 ipv6.Equals(TUN_BLACKHOLE_IPV6_ADDR) ||
  738.                 ipv6.StartsWith("::"))
  739.                 return;
  740.  
  741.             // get subnet for ipv6 address
  742.             InetPton(ADDRESS_FAMILIES.AF_INET6, "fff0::", ref mask_addr6.sin6_addr);
  743.  
  744.             subnet_addr6.sin6_addr.Byte_0 = (byte)(addr6.sin6_addr.Byte_0 & mask_addr6.sin6_addr.Byte_0);
  745.             subnet_addr6.sin6_addr.Byte_1 = (byte)(addr6.sin6_addr.Byte_1 & mask_addr6.sin6_addr.Byte_1);
  746.             subnet_addr6.sin6_addr.Byte_2 = (byte)(addr6.sin6_addr.Byte_2 & mask_addr6.sin6_addr.Byte_2);
  747.             subnet_addr6.sin6_addr.Byte_3 = (byte)(addr6.sin6_addr.Byte_3 & mask_addr6.sin6_addr.Byte_3);
  748.             subnet_addr6.sin6_addr.Byte_4 = (byte)(addr6.sin6_addr.Byte_4 & mask_addr6.sin6_addr.Byte_4);
  749.             subnet_addr6.sin6_addr.Byte_5 = (byte)(addr6.sin6_addr.Byte_5 & mask_addr6.sin6_addr.Byte_5);
  750.             subnet_addr6.sin6_addr.Byte_6 = (byte)(addr6.sin6_addr.Byte_6 & mask_addr6.sin6_addr.Byte_6);
  751.             subnet_addr6.sin6_addr.Byte_7 = (byte)(addr6.sin6_addr.Byte_7 & mask_addr6.sin6_addr.Byte_7);
  752.             subnet_addr6.sin6_addr.Byte_8 = (byte)(addr6.sin6_addr.Byte_8 & mask_addr6.sin6_addr.Byte_8);
  753.             subnet_addr6.sin6_addr.Byte_9 = (byte)(addr6.sin6_addr.Byte_9 & mask_addr6.sin6_addr.Byte_9);
  754.             subnet_addr6.sin6_addr.Byte_10 = (byte)(addr6.sin6_addr.Byte_10 & mask_addr6.sin6_addr.Byte_10);
  755.             subnet_addr6.sin6_addr.Byte_11 = (byte)(addr6.sin6_addr.Byte_11 & mask_addr6.sin6_addr.Byte_11);
  756.             subnet_addr6.sin6_addr.Byte_12 = (byte)(addr6.sin6_addr.Byte_12 & mask_addr6.sin6_addr.Byte_12);
  757.             subnet_addr6.sin6_addr.Byte_13 = (byte)(addr6.sin6_addr.Byte_13 & mask_addr6.sin6_addr.Byte_13);
  758.             subnet_addr6.sin6_addr.Byte_14 = (byte)(addr6.sin6_addr.Byte_14 & mask_addr6.sin6_addr.Byte_14);
  759.             //subnet_addr6.sin6_addr.Byte_15 = (byte)(addr6.sin6_addr.Byte_15 & mask_addr6.sin6_addr.Byte_15);
  760.             subnet_addr6.sin6_addr.Byte_16 = (byte)(addr6.sin6_addr.Byte_16 & mask_addr6.sin6_addr.Byte_16);
  761.  
  762.             InetNtop(ADDRESS_FAMILIES.AF_INET6, ref subnet_addr6.sin6_addr, szSubnetIPv6Addr, INET6_ADDRSTRLEN);
  763.  
  764.             // add route for ipv6 blackhole
  765.             Execute("netsh interface ipv6 add route prefix=" + szSubnetIPv6Addr.ToString() + " interface=" + tunIfIndex.ToString() + " " + IPV6_BLACKHOLE_ROUTE_ADDR);
  766.         }
  767.         #endregion
  768.         #region Entry Point
  769.         static void Main(string[] args)
  770.         {
  771.             // get index of TUN interface
  772.             int tunIfIndex = GetTUNInterfaceID();
  773.             if (tunIfIndex.Equals(0))
  774.             {
  775.                 Console.WriteLine("Couldn't find the TUN interface");
  776.                 return;
  777.             }
  778.  
  779.             // set IPv6 address to TUN interface
  780.             SetIPv6AddrToTun(tunIfIndex);
  781.  
  782.             // set blackhole route
  783.             SetIPv6BlackHoleRoute(tunIfIndex);
  784.         }
  785.         #endregion
  786.     }
  787. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement