#packet-parser #wifi #packet #parser #scapy

simple_wifi

简单的 802.11 Wi-Fi 数据包解析器

3 个版本

0.1.6 2024 年 5 月 11 日
0.1.5 2024 年 5 月 11 日
0.1.4 2024 年 1 月 29 日

#36 in #packet-parser

每月 27 次下载

MIT 许可证

38KB
670

simple_wifi 是一个用于快速解码 802.11 Wi-Fi 数据包的模块

simple_wifi 接收原始数据包并提供数据包名称、数据包类型、数据包子类型、toDS、FromDS、信号、信道、地址1、地址2、地址3、地址4、SSID。它还允许您将数据包写入 pcap 文件。

更新

现在您可以将解码过程中出错的数据包写入 pcap 文件。增加了更多的 RadioTap Header 长度以供解码。添加了对 DMG 信标的解码。数据包类型:3 子类型:0。添加了另一个 ssid 以查看所有字符是否为空。如果是,则 ssid 将为 "U_n_k_n_o_w_n"。

测试

simple_wifi 在使用 Alpha Wi-Fi 卡的 Linux Debian 发行版上进行了测试。使用模块 pnet 打开套接字并嗅探 Wi-Fi 卡的数据包。

示例

# extern crate pnet;
# extern crate simple_wifi;
use pnet::datalink::{ self, NetworkInterface, Channel::Ethernet};
use simple_wifi::*;
use std::process;

fn main() {
    // Wi-Fi card to sniff packets with.//!
    let wifi_card: &str = "wlo1";

    // Finding the interface that matches the wifi_card. So it can be used for sniffing.
    let interface: NetworkInterface = datalink::interfaces()
        .into_iter()
        .filter(|iface: &NetworkInterface| iface.name == wifi_card)
        .next()
        .unwrap();

    // Setting up the channel to the interface so you can sniff Wi-Fi packets.
    let (_, mut rx) = match datalink::channel(&interface, Default::default()) {
        Ok(Ethernet(tx, rx)) => (tx, rx),
        Ok(_) => {
            println!("\x1b[38;5;9mUnhandled channel type\x1b[0m");
            process::exit(0);
        },
        Err(e) => {
            println!("\x1b[38;5;9mAn error occurred when creating the datalink channel: {e}\x1b[0m");
            process::exit(0);
        }

    };

    loop {
        let pkt: &[u8] = match rx.next() {
            Ok(pkt) => pkt,
            Err(_) => continue
        };

        let pkt_info: Packet = match Packet::new(pkt) {
            Ok(t) => t,
            Err(e) => {
                println!("\x1b[38;5;9m{e}\x1b[0m");
                let _ = write_pcap(&pkt.to_vec(), "/home/user/error.pcap");
                continue;
            }
        };

        println!("{pkt_info:#?}");
        println!(
            "Address1: {}, Address2: {}\nAddress3: {}, Address4: {}",
            pkt_info.addr1, pkt_info.addr2, pkt_info.addr3, pkt_info.addr4
        )
    }
}

依赖项

~345KB