#packet #filter #adapter #filtering #driver #level #raw

ndisapi

Rust的Rust crate,用于与Windows数据包筛选器驱动程序(NDISAPI)交互

8个版本

0.6.0 2024年3月24日
0.5.5 2024年1月11日
0.5.3 2023年11月29日
0.5.1 2023年7月20日

#415 in 网络编程

Download history 78/week @ 2024-03-30 121/week @ 2024-04-06 138/week @ 2024-04-13 45/week @ 2024-04-20 13/week @ 2024-04-27 78/week @ 2024-05-04 140/week @ 2024-05-11 90/week @ 2024-05-18 74/week @ 2024-05-25 102/week @ 2024-06-01 162/week @ 2024-06-08 17/week @ 2024-06-15 8/week @ 2024-06-22 25/week @ 2024-06-29 11/week @ 2024-07-06 11/week @ 2024-07-13

每月 56 次下载

Apache-2.0

325KB
4.5K SLoC

NDISAPI

Crates.io Documentation License

NDISAPI是一个Rust crate,用于与Windows数据包筛选器驱动程序交互。它提供了一个易于使用、安全且高效的接口,以便在网络堆栈的NDIS级别上以最小的网络活动影响高效地筛选(检查和修改)原始网络数据包。

Windows数据包筛选器(WinpkFilter)是一个高性能、轻量级的Windows数据包筛选框架,使开发者能够高效地检查、修改和控制NDIS级别的原始网络数据包。凭借友好的API和针对各种Windows版本的支持,WinpkFilter简化了网络数据包操作,无需内核模式编程知识。

特性

  • 枚举网络适配器
  • 查询和设置网络适配器属性
  • 捕获和分析数据包
  • 筛选和修改数据包
  • 发送原始数据包

依赖项

安装

将以下内容添加到您的Cargo.toml文件中

[dependencies]
ndisapi = "0.6.0"

使用方法

以下是如何枚举网络适配器并打印它们信息的示例

use ndisapi::{MacAddress, Ndisapi};

fn main() {
    let ndis = Ndisapi::new("NDISRD").expect("Failed to create NdisApi instance");

    let adapters = ndis
        .get_tcpip_bound_adapters_info()
        .expect("Failed to enumerate adapters");

    for adapter in adapters {
        println!("Adapter: {:?}", adapter.get_name());
        println!(
            "Description: {:?}",
            Ndisapi::get_friendly_adapter_name(adapter.get_name()).unwrap_or("Unknown".to_string())
        );
        println!(
            "MAC Address: {:?}",
            MacAddress::from_slice(adapter.get_hw_address()).unwrap_or_default()
        );
        println!("-------------------------------");
    }
}

有关更多示例和深入使用方法,请参阅文档

演示

以下是如何运行listadapters示例的示例

S D:\github.com\ndisapi-rs> cargo run --example listadapters
    Finished dev [unoptimized + debuginfo] target(s) in 0.12s
     Running `target\debug\examples\listadapters.exe`
Detected Windows Packet Filter version 3.4.8
1. Local Area Connection* 10
        \DEVICE\{EDEE8C42-F604-4A7B-BFAA-6B110923217E}
         Medium: 0
         MAC: 9A:47:3D:60:26:9D
         MTU: 1500
         FilterFlags: FilterFlags(0x0)
Getting OID_GEN_CURRENT_PACKET_FILTER Error: Data error (cyclic redundancy check).
         OID_802_3_CURRENT_ADDRESS: 9A:47:3D:60:26:9D
2. vEthernet (Default Switch)
        \DEVICE\{BD64DB34-23DF-45C4-909E-780272A98BAE}
         Medium: 0
         MAC: 00:15:5D:01:8C:00
         MTU: 1500
         FilterFlags: FilterFlags(0x0)
         OID_GEN_CURRENT_PACKET_FILTER: 0x0000000B
         OID_802_3_CURRENT_ADDRESS: 00:15:5D:01:8C:00
...
11. vEthernet (WLAN Virtual Switch)
        \DEVICE\{05F9267C-C548-4822-8535-9A57F1A99DB7}
         Medium: 0
         MAC: 18:47:3D:60:26:9D
         MTU: 1500
         FilterFlags: FilterFlags(0x0)
         OID_GEN_CURRENT_PACKET_FILTER: 0x0000000B
         OID_802_3_CURRENT_ADDRESS: 18:47:3D:60:26:9D

System wide MTU decrement: 0

System wide network adapter startup filter mode: 0

Driver intermediate buffer pool size multiplier: 0

Effective intermediate buffer pool size: 2048

以下是对异步-packthru示例的演示。对于此场景,我们将假设vEthernet (WLAN虚拟交换机)是默认的互联网连接

PS D:\github.com\ndisapi-rs> cargo run --example async-packthru -- --interface-index 11
    Finished dev [unoptimized + debuginfo] target(s) in 0.11s
     Running `target\debug\examples\async-packthru.exe --interface-index 11`
Detected Windows Packet Filter version 3.4.8
Using interface \DEVICE\{05F9267C-C548-4822-8535-9A57F1A99DB7}
Press ENTER to exit

image

许可证

本项目的许可证为Apache License 2.0。有关详细信息,请参阅LICENSE

依赖项

~129MB
~2M SLoC