using System; using System.Text; // StringBuilder and Regex using System.Collections; // For IEnumerable and CollectionBase using System.Runtime.InteropServices; // For DLLImports and other InterOpServices namespace ninjaneo { class Application { static void Main(string[] args) { #region Application Control EtherNinja _etherNinja = new EtherNinja(); foreach (EtherNinja.Device _device in _etherNinja.Devices) { Console.WriteLine("\"{0:s}\"\r\n\t{1:s}", _device.Description, _device.Name); foreach (EtherNinja.Device.Address _address in _device.Addresses) { Console.WriteLine(); Console.WriteLine("\t\tIP Address\t: {0:s}", _address.IP.ToString()); Console.WriteLine("\t\tBroadcast\t: {0:s}", _address.Broadcast.ToString()); Console.WriteLine("\t\tSubnet Mask\t: {0:s}", _address.Netmask.ToString()); Console.WriteLine(); } Console.WriteLine(); } Console.ReadLine(); #endregion } } public class EtherNinja { public DeviceCollection Devices = new DeviceCollection(); public EtherNinja() { foreach (Device _device in WinPCap.GetDevices()) { Devices.Add(_device); } } public enum NetworkType : ushort { UNSPEC, LOCAL, INET, IMPLINK, PUP, CHAOS, NS, ISO, ECMA, DATAKIT, CCITT, SNA, DECnet, DLI, LAT, HYLINK, APPLETALK, ROUTE, LINK, pseudo_XTP, COIP, CNT, pseudo_RTIP, IPX, SIP, pseudo_PIP, ISDN, pseudo_KEY, INET6, NATM, ATM, pseudo_HDRCMPLT, NETGRAPH, MAX } static class Functions { #region Hex Encoding and Parsing Functions public static class HexEncoding { public static string GetString(string _hex) { System.Text.RegularExpressions.Regex regex; System.Text.RegularExpressions.MatchCollection matchColllection; string _output = ""; regex = new System.Text.RegularExpressions.Regex("[a-fA-F0-9]{1,2}"); matchColllection = regex.Matches(_hex); foreach (System.Text.RegularExpressions.Match _match in matchColllection) { _output += (char)byte.Parse(_match.ToString(), System.Globalization.NumberStyles.HexNumber); } return _output; } } #endregion #region General Data Manipulation and Extraction public static byte[] GetBytes(byte[] _obj, int _length) { return GetBytes(_obj, 0, _length); } public static byte[] GetBytes(byte[] _obj, int _offset, int _length) { byte[] _elements = new byte[_length]; Array.ConstrainedCopy(_obj, _offset, _elements, 0, _length); return _elements; } #endregion #region Network Math such as finding the broadcast/network addresses #endregion } #region IPHLPAPI Library class iphlpapi { } #endregion #region WinPCap Library public static class WinPCap { const int pcapErrorBufferSize = 256; #region DLL Imports [DllImport("wpcap.dll", CharSet = CharSet.Auto)] extern static int pcap_findalldevs(ref IntPtr handle, StringBuilder errBuff); [DllImport("wpcap.dll", CharSet = CharSet.Ansi)] extern static void pcap_freealldevs(IntPtr enumHandle); #endregion public enum PCapDeviceFlags : uint { testflaga = 1, testflagb = 2 } [StructLayout(LayoutKind.Sequential)] public struct SocketAddress { public NetworkType Family; public ushort Port; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] Data; } [StructLayout(LayoutKind.Sequential)] public struct PCapAddress { public IntPtr NextPCapAddress; public IntPtr SocketAddress; public IntPtr NetmaskSocketAddress; public IntPtr BroadcastSocketAddress; public IntPtr DestinationSocketAddress; } [StructLayout(LayoutKind.Sequential)] public struct PCapDevice { public IntPtr NextPCapDevice; public string Name; public string Description; public IntPtr addressesPointer; public PCapDeviceFlags Flags; } public static IEnumerable GetDevices() { StringBuilder error = new StringBuilder(pcapErrorBufferSize); IntPtr _pcapDevicePtr = IntPtr.Zero; IntPtr _pcapFindAllDevs = IntPtr.Zero; PCapDevice _pcapDevice; pcap_findalldevs(ref _pcapFindAllDevs, error); try { for (_pcapDevicePtr = _pcapFindAllDevs; _pcapDevicePtr != IntPtr.Zero; _pcapDevicePtr = _pcapDevice.NextPCapDevice) { _pcapDevice = (PCapDevice)Marshal.PtrToStructure(_pcapDevicePtr, typeof(PCapDevice)); yield return new Device(_pcapDevice); } } finally { pcap_freealldevs(_pcapFindAllDevs); } } } #endregion #region Network Stack public class MacAddress { public char[] Address = new char[6]; public MacAddress(string value) { Hex = value; } public MacAddress(char[] value) { Address = value; } public string Hex { get { return Address.ToString(); } set { Address = Functions.HexEncoding.GetString(value).ToCharArray(); } } public override string ToString() { return Address.ToString(); } } public class Raw : NetworkStack { string _pdu; public override object Pdu { get { return _pdu; } set { _pdu = (string)value; } } } public abstract class NetworkStack { public abstract object Pdu { get; set; } public virtual string ToString() { return Pdu.ToString(); } } #endregion public class Device { public string Name; public string Description; public AddressCollection Addresses; public Device(WinPCap.PCapDevice _device) { Name = _device.Name; Description = _device.Description; Addresses = new AddressCollection(); foreach (Address _address in GetAddresses(_device.addressesPointer)) { Addresses.Add(_address); } } public class Address { public System.Net.IPAddress IP; public System.Net.IPAddress Destination; public System.Net.IPAddress Broadcast; public System.Net.IPAddress Netmask; public Address(System.Net.IPAddress _ip, System.Net.IPAddress _destination, System.Net.IPAddress _broadcast, System.Net.IPAddress _netmask) { IP = _ip; Destination = _destination; Broadcast = _broadcast; Netmask = _netmask; } public Address(IntPtr _ip, IntPtr _destination, IntPtr _broadcast, IntPtr _netmask) : this(GetIP(_ip), GetIP(_destination), GetIP(_broadcast), GetIP(_netmask)) { } static System.Net.IPAddress GetIP(IntPtr _addressPointer) { if (_addressPointer == IntPtr.Zero) return new System.Net.IPAddress(0); WinPCap.SocketAddress addr = (WinPCap.SocketAddress)Marshal.PtrToStructure(_addressPointer, typeof(WinPCap.SocketAddress)); switch (addr.Family) { case NetworkType.INET: return new System.Net.IPAddress(Functions.GetBytes(addr.Data, 4)); case NetworkType.INET6: return new System.Net.IPAddress(addr.Data); default: return new System.Net.IPAddress(0); } } } public class AddressCollection : CollectionBase { public Address this[int index] { get { return (Address)List[index]; } } public int Add(Address addr) { return List.Add(addr); } } public static IEnumerable GetAddresses(IntPtr _pcapAddress) { for (WinPCap.PCapAddress _addressStruct; _pcapAddress != IntPtr.Zero; _pcapAddress = _addressStruct.NextPCapAddress) { _addressStruct = (WinPCap.PCapAddress)Marshal.PtrToStructure(_pcapAddress, typeof(WinPCap.PCapAddress)); yield return new Address(_addressStruct.SocketAddress, _addressStruct.DestinationSocketAddress, _addressStruct.BroadcastSocketAddress, _addressStruct.NetmaskSocketAddress); } } } public class DeviceCollection : CollectionBase { public Device this[int _index] { get { return (Device)List[_index]; } } public int Add(Device _device) { return List.Add(_device); } } } public class Crypto { #region Cycilic Redudancy Check algorithim public class Crc { public string Hash(string value) { return "CHKS"; } } #endregion } }