From 479fcb2169f9a122a91247ac424bce45ed45e0ff Mon Sep 17 00:00:00 2001 From: Obfusu22 <4481203+obfusu@users.noreply.github.com> Date: Mon, 29 Jun 2026 09:01:41 +0530 Subject: [PATCH] Init commit --- .gitignore | 1 + Cargo.lock | 7 +++++++ Cargo.toml | 6 ++++++ README.md | 29 +++++++++++++++++++++++++++++ src/main.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..09a378d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "woly" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9892f3c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "woly" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/README.md b/README.md new file mode 100644 index 0000000..954b9dc --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +## Woly + +Construct Wake on Lan (WoL) magic packet to power on mini PC via LAN + +## Usage + +``` +woly aa:bb:cc:dd:ee:ff +``` + +## Magic Packet + +Magic packet is constructed as follows + +FF x 6; Mac Address x 15 + +eg. +``` +FF FF FF FF FF FF +AA BB CC DD EE FF +AA BB CC DD EE FF +... +``` + +## Target Destination + +The magic packet shall be sent to limited broadcast IP - `255.255.255.255` and the Discard Protocol Port `9`. + +While sending it to targeted IP, for eg. 192.168.0.2 bound to desired mac address of the device might work, it is not reliable as sometimes the ARP cache will not be updated by router due to device being in low power mode and will drop this packet. \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..9e395f8 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,28 @@ +use std::env::args; +use std::net::UdpSocket; + +fn get_magic_pkt(mac: String) -> [u8; 102] { + let mut mac_bytes = [0u8; 6]; + let mut magic_bytes = [0u8; 102]; + magic_bytes[..6].fill(0xFF); + + for (i, part) in mac.split(':').enumerate() { + mac_bytes[i] = u8::from_str_radix(part, 16).unwrap(); + } + for i in 0..16 { + let start = 6 + i * 6; + magic_bytes[start..start + 6].copy_from_slice(&mac_bytes); + } + + magic_bytes +} + +fn main() { + let mac = args().nth(1).expect("no mac given; Usage woly aa:bb:cc:dd:ee:ff"); + let magic_bytes = get_magic_pkt(mac); + + let socket = UdpSocket::bind("0.0.0.0:0").expect("couldnt' bind socket"); + socket.set_broadcast(true).expect("couldn't set broadcast"); + socket.send_to(&magic_bytes, "255.255.255.255:9").expect("couldn't send data"); + println!("{:02X?}", magic_bytes); +}