Search code examples
c#network-programmingwifiwireless

Sending packets without network connection (wireless adapter)


I have to send packets with a wifi adapter to another computer without connecting to any network, targeting Windows 7 and above. First of all, ad-hoc (as I understand) doesn't fit my needs because it requires connection.

I had two ideas:

  1. create something similar to a broadcast packet which identify networks. This can be used on wireless card

  2. send fake but valid packet and which doesn't need a specific IP/MAC address (they can be broadcasts for example).

What I use: C# with a Win7 PC and a Win7 laptop for testing the program. SharpPcap to send packets. Wireshark to check if they are arrived.

I tried the second method:

static void Main(string[] args)
{
    WinPcapDeviceList devs = WinPcapDeviceList.Instance;
    foreach (WinPcapDevice wdev in devs)
    {
        System.Console.Write("Device: ");
        System.Console.WriteLine(wdev.Description);
        foreach (var addr in wdev.Addresses)
            System.Console.WriteLine(addr.Addr);
        System.Console.WriteLine("--------------");
    }

    System.Console.Write("Select device: #");
    int selected = int.Parse(System.Console.ReadLine());
    var dev = devs[selected]; //yes, no checking for oob...
    dev.Open();

    while (true)
    {
        byte[] physBroad = new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
        EthernetPacket etherPacket = new EthernetPacket(
            dev.MacAddress,
            new PhysicalAddress(physBroad),
            EthernetPacketType.IpV4);

        IPv4Packet ip4Packet = new IPv4Packet(
            new IPAddress(0),
            IPAddress.Broadcast);

        ip4Packet.Protocol = IPProtocolType.UDP;

        etherPacket.PayloadPacket = ip4Packet;

        UdpPacket udpPacket = new UdpPacket(
            80, //tried with different port setups
            80);

        udpPacket.PayloadData = Encoding.UTF8.GetBytes("test packet");
        ip4Packet.PayloadPacket = udpPacket;

        dev.SendPacket(etherPacket);
    }
}

Without connecting to the same network they are discarded (not arrive at Wireshark). I can only see the packets if they are on the same network.

For the first one, I know about IEEE 802.11, but I can't find anything about how to craft and send those packets. Is it possible to do this without dedicated hardware like AirPcap? I'd like to avoid writing a driver too if not necessary.

ps: I have an Edimax Wireless LAN card in my PC, and a Mediatek MT763E 802.11bgn Wifi-Adapter in my laptop. I installed the same version of Wireshark on both of them, but I can't turn the monitor mode on, and cannot set the link-layer type to IEEE-802.11, only to Ethernet and DOCSIS types.


Solution

  • Change your WiFi SSID to the message :-)

    enter image description here

    Or this:

    enter image description here