feat: add rust-rawsock-demo

This commit is contained in:
2024-03-24 10:15:37 +08:00
parent 930c35abff
commit 051eb5fecc
4 changed files with 269 additions and 0 deletions

166
__network/rust-rawsock-demo/Cargo.lock generated Normal file
View File

@@ -0,0 +1,166 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "cc"
version = "1.0.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5"
[[package]]
name = "dlopen"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937"
dependencies = [
"dlopen_derive",
"lazy_static",
"libc",
"winapi",
]
[[package]]
name = "dlopen_derive"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581"
dependencies = [
"libc",
"quote",
"syn",
]
[[package]]
name = "errno"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
dependencies = [
"errno-dragonfly",
"libc",
"winapi",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "proc-macro2"
version = "0.4.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "0.6.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rawsock"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb3edb83948587d85e23284103bfa797da3f16f686d89dad4c42366ef65a9266"
dependencies = [
"bitflags",
"dlopen",
"dlopen_derive",
"errno",
"libc",
"time",
]
[[package]]
name = "rust-rawsock-demo"
version = "0.1.0"
dependencies = [
"rawsock",
]
[[package]]
name = "syn"
version = "0.15.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "time"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
dependencies = [
"libc",
"wasi",
"winapi",
]
[[package]]
name = "unicode-xid"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
[[package]]
name = "wasi"
version = "0.10.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

View File

@@ -0,0 +1,9 @@
[package]
name = "rust-rawsock-demo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rawsock = "0.3.0"

View File

@@ -0,0 +1,24 @@
use rawsock::{InterfaceDescription, open_best_library};
fn print_interfaces(interfs: Vec<InterfaceDescription>) {
println!("Found interfaces:");
for (num, interf) in interfs.iter().enumerate() {
println!("{}: {}, {}", num, interf.name, interf.description);
}
}
// from: https://github.com/szymonwieloch/rust-rawsock/tree/master/examples
fn main() {
// this is generic version that work with the current library:
let lib = open_best_library().expect("Could not open any library");
let interfs = lib.all_interfaces().expect("Could not obtain interface list");
print_interfaces(interfs);
// use rawsock::traits::Library;
// //this is a version with concrete library type
// //pcap and pfring support different subsets of interfaces and add some virtual interfaces
// //although "real" interfaces should be available in both of them
// let lib = rawsock::pcap::Library::open_default_paths().expect("Could not open pcap library");
// let interfs = lib.all_interfaces().expect("Could not obtain interface list");
// print_interfaces(interfs);
}

View File

@@ -0,0 +1,70 @@
use rawsock::{pcap, pfring, wpcap};
use rawsock::traits::{DynamicInterface, Library};
pub const ICMP_PACKET: [u8; 84] = [
0x45, 0x00, 0x00, 0x54, 0xee, 0x96, 0x40, 0x00, 0x40, 0x01, 0x79, 0xf0, 0xc0, 0xa8, 0x01, 0x6a,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x2f, 0x08, 0x66, 0xc2, 0x00, 0x12, 0x82, 0xaa, 0xcc, 0x5c,
0x00, 0x00, 0x00, 0x00, 0x51, 0x49, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33,
0x34, 0x35, 0x36, 0x37];
pub fn open_library<T>() -> T where T: Library {
let lib = T::open_default_paths().expect("Could not open library");
println!("Library opened, version is {}", lib.version());
lib
}
pub fn receive_packets<'a, T>(interf: &mut T) where T: DynamicInterface<'a> {
println!("Receiving 5 packets:");
for i in 1..6 {
let packet = interf.receive().expect("Error while receiving packet");
println!("Packet {} is {}", i, packet);
}
}
pub fn send_packets<'a, T>(interf: &mut T) where T: DynamicInterface<'a> {
println!("Data link: {}", interf.data_link());
println!("Sending 5 ICMP ping packets:");
for i in 1..6 {
interf.send(&ICMP_PACKET).expect("Errow while sending packet");
println!("Packet {} was sent", i);
}
}
// from: https://github.com/szymonwieloch/rust-rawsock/tree/master/examples
fn main() {
run_pcap();
run_pfring();
run_wpcap();
}
fn run_pcap() {
let lib = open_library::<pcap::Library>();
let ifname = lib.all_interfaces()
.expect("Could not obtain interface list").first()
.expect("There are no available interfaces").name.clone();
let mut interf = lib.open_interface(&ifname).expect("Could not open pcap interface");
send_packets(&mut interf);
receive_packets(&mut interf);
}
fn run_wpcap() {
let lib = open_library::<wpcap::Library>();
let ifname = lib.all_interfaces()
.expect("Could not obtain interface list").first()
.expect("There are no available interfaces").name.clone();
let mut interf = lib.open_interface(&ifname).expect("Could not open wpcap interface");
send_packets(&mut interf);
receive_packets(&mut interf);
}
fn run_pfring() {
let lib = open_library::<pfring::Library>();
let ifname = lib.all_interfaces()
.expect("Could not obtain interface list").first()
.expect("There are no available interfaces").name.clone();
let mut interf = lib.open_interface(&ifname).expect("Could not open pfring interface");
send_packets(&mut interf);
receive_packets(&mut interf);
}