3 个版本 (破坏性更新)
0.4.0 | 2023 年 4 月 14 日 |
---|---|
0.2.0 | 2023 年 4 月 4 日 |
0.1.0 | 2022 年 11 月 25 日 |
#682 in 开发工具
每月下载量 2,684
105KB
3K SLoC
packet_rs 是一个基于 Rust 的 Scapy 替代品
简介
packet_rs 是一个基于 Rust 的 Scapy(Python 编程语言的一个库)的替代品。它尝试提供一个类似 Scapy 的 API 接口来定义新的头部和构建数据包。
packet_rs 已经预定义了最常见的网络头部。
make_header
库的核心是 make_header 宏,它提供了一种灵活的方式来创建新的头部。
以下格式描述新的头部,默认值作为向量。
make_header! {
<header_name> <length in bytes> (
<field_name1> <start_bit> - <end_bit>,
<field_name2> <start_bit> - <end_bit>,
)
<optional default data vec>
};
定义头部
使用 make_header 宏添加新的头部。这将自动为每个字段创建 set_field() 和 field() 辅助方法。
#[macro_use]
extern crate packet_rs;
use packet_rs::headers::*;
use packet_rs::Packet;
make_header!(
MyHeader 4
(
field_1: 0-2,
field_2: 3-3,
field_3: 4-15,
field_4: 16-31
)
vec![0x0, 0xa, 0x8, 0x0] // <= optional default data
);
创建头部的方式
// Call new on the *MyHeader* header
let hdr = MyHeader::new();
// Pass a data buffer as an argument
let hdr = MyHeader([0x00, 0x0a, 0x08, 0x10]);
make_header! 为每个头部和字段生成辅助方法和相关函数
hdr.octets(); // get the vlan header as a byte array
println!("{}", hdr.field_2()); // fetch the cfi field value
hdr.set_field_2(1); // set the cfi field value
let hdr_new = hdr.clone(); // clone the packet
hdr.show(); // display the vlan header
Output of show():
Raw: 00 0a 08 00
#### MyHeader Size Data
-------------------------------------------
field_1 : 3 : 02
field_2 : 1 : 01
field_3 : 12 : 00 10
field_4 : 16 : 08 00
创建数据包
数据包是有序的头部列表。根据需要将头部推入数据包中。
let mut pkt = Packet::new(100);
pkt.push(Ether::new()));
pkt.push(IPv4::new());
pkt.show()
#### Ether Size Data
-------------------------------------------
dst : 48 : 00 01 02 03 04 05
src : 48 : 00 06 07 08 09 0a
etype : 16 : 08 00
#### IPv4 Size Data
-------------------------------------------
version : 4 : 04
ihl : 4 : 05
diffserv : 8 : 00
total_len : 16 : 00 14
identification : 16 : 00 33
flags : 3 : 02
frag_startset : 13 : 06 29
ttl : 8 : 64
protocol : 8 : 06
header_checksum : 16 : fa ec
src : 32 : c0 a8 00 01
dst : 32 : c0 a8 00 02
// access ethernet header immutable
let x: &Ether<Vec<u8>> = (&pkt["Ether"]).into();
println!("{}", x.etype());
// access ethernet header mutable
let x: &mut Ether<Vec<u8>> = (&mut pkt["Ether"]).into();
x.set_etype(0x1111);
依赖
~0–5.5MB
~13K SLoC