WOL 是一种非常灵活的协议,可以以多种不同的方式实现。
最常见的是:
- 发送 WOL 作为以太网数据包的有效负载。
- 发送 WOL 作为 UDP 数据包的有效负载(用于通过网络路由)。
一旦它登陆本地网络,它就会使用广播 MAC 地址传递给网络上的所有主机。
对于以太网数据包,其结构为:
- 目标 MAC:FF:FF:FF:FF:FF:FF(广播)
- 魔术包有效负载
对于 UDP 数据包,结构为:
- 目标 MAC:FF:FF:FF:FF:FF:FF(广播)
- UDP 端口:9
- 魔术包有效负载
魔术有效载荷包括:
- 同步流:FFFFFFFFFFFF(即 6 对或 6 个字节的 FF)
- 您向 WOL 发送信号的计算机 MAC 的 16 个副本
- 0、4 或 6 个字节的可选密码。
从互联网接收 WOL 数据包(通过防火墙/路由器):
- 配置路由器端口9转发到IP 255.255.255.255(广播IP)
- 设置目的IP:路由器的外网IP
注意:这只能使用 UDP 示例来实现,因为以太网数据包缺少通过 Internet 路由数据包所需的 IP 层。IE,以太网数据包是本地网络唯一选项。通过 UDP 发送 WOL 数据包的问题是安全性,因为您必须将路由器设置为启用 IP 广播 (255.255.255.255)。启用 IP 广播通常被认为是一个坏主意,因为会增加网络内部攻击的风险(Ping 泛洪、缓存欺骗等)。
有关协议的更多信息,包括样本捕获,请参阅此站点。
如果您想要一个生成 WOL 数据包的快速而简单的命令行工具(并且您在 debian、linux mint 或 Ubuntu 上运行),您可以安装一个已经执行此操作的工具。
只需使用命令行安装:
sudo apt-get install wakeonlan
更新:
这是一个使用当前版本的 SharpPcap 生成 WakeOnLan 数据包的工作示例。
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using PacketDotNet;
using SharpPcap;
namespace SharpPcap.Test.Example9
{
public class DumpTCP
{
public static void Main(string[] args)
{
// Print SharpPcap version
string ver = SharpPcap.Version.VersionString;
Console.WriteLine("SharpPcap {0}, Example9.SendPacket.cs\n", ver);
// Retrieve the device list
var devices = CaptureDeviceList.Instance;
// If no devices were found print an error
if(devices.Count < 1)
{
Console.WriteLine("No devices were found on this machine");
return;
}
Console.WriteLine("The following devices are available on this machine:");
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
int i = 0;
// Print out the available devices
foreach(var dev in devices)
{
Console.WriteLine("{0}) {1}",i,dev.Description);
i++;
}
Console.WriteLine();
Console.Write("-- Please choose a device to send a packet on: ");
i = int.Parse( Console.ReadLine() );
var device = devices[i];
Console.Write("What MAC address are you sending the WOL packet to: ");
string response = Console.ReadLine().ToLower().Replace(":", "-");
//Open the device
device.Open();
EthernetPacket ethernet = new EthernetPacket(PhysicalAddress.Parse(
"ff-ff-ff-ff-ff-ff"), PhysicalAddress.Parse("ff-ff-ff-ff-ff-ff"),
EthernetPacketType.WakeOnLan);
ethernet.PayloadPacket = new WakeOnLanPacket(
PhysicalAddress.Parse(response));
byte[] bytes = ethernet.BytesHighPerformance.Bytes;
try
{
//Send the packet out the network device
device.SendPacket(bytes);
Console.WriteLine("-- Packet sent successfuly.");
}
catch(Exception e)
{
Console.WriteLine("-- "+ e.Message );
}
//Close the pcap device
device.Close();
Console.WriteLine("-- Device closed.");
Console.Write("Hit 'Enter' to exit...");
Console.ReadLine();
}
}
}
注意:这是基于 Example09 构建的全功能 Wake-On-Lan 数据包发送控制台应用程序,可在 SharpPcap 源代码中找到。
此示例中使用的在 .NET 框架中找不到的库是:
using PacketDotNet;
该库 (.dll) 与 SharpPcap 一起打包。它负责 SharpPcap 中的所有数据包构造和解析。这是 WakeOnLan 类所在的位置。
注意:数据包构造/解析代码最初捆绑在 SharpPcap.dll 中。它被迁移到了自己的库,因为 SharpPcap 旨在成为 winpcap 的包装器。它的许多用户处理设计协议和/或处理原始网络数据包。
using SharpPcap;
SharpPcap 包含所有 winpcap(windows)/libpcap(*nix) 包装器代码。需要选择接口并通过线路发送实际数据包。