一、Libnet介绍
Libnet是一个用于网络信息操作的开源C库,它提供了一组API,可用于创建和处理网络协议数据包。Libnet可以在不同的操作系统上运行,如Linux、FreeBSD、OpenBSD、Mac OS X和Windows等。它可以帮助开发人员快速构建定制的网络应用程序,包括网络安全工具、入侵检测系统和漏洞扫描器等。
Libnet的主要特点包括:
1. 提供多种网络协议支持,如TCP、UDP、ICMP、IP等。
2. 可以创建多种协议数据包,包括ARP、RIP、OSPF等。
3. 可以自定义协议数据包,以满足特定需求。
4. 支持IPv4和IPv6协议。
5. 可以在用户空间(user-space)和内核空间(kernel-space)之间交换数据包。
6. 对于网络数据包处理提供了高度的控制。
二、Libnet安装
sudo apt-get install libnet-dev
三、开发举例
利用libnet函数的相关API开发步骤一般为:
1、数据包内存初始化
//初始化
libnet_t *net=libnet_init(LIBNET_LINK_ADV,"ens33",NULL);
if(net == NULL)
{
perror("libnet_init\n");
return 0;
}
//创建标签
libnet_ptag_t udp_tag = 0; //创建UDP标签
libnet_ptag_t ip_tag = 0; //创建IP标签
libnet_ptag_t mac_tag = 0; //创建Mac标签
libnet_init相关参数:
libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
injection_type: 构造的类型(LIBNET_LINK,LIBNET_RAW4, LIBNET_LINK_ADV,LIBNET_RAW4_ADV);
device:网络接口
err_buf: 存放出错的信息
2、构建数据包
①构建UDP包:
libnet_ptag_tlibnet_build_udp(uint16_t sp, uint16_t dp, uint16_t len, uint16_t sum,const uint8_t* payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
库中函数说明:
参数说明:
sp: 源端口号
dp:目的端口号
len:udp 包总长度
sum:校验和,设为 0,libnet 自动填充
payload:负载,可设置为 NULL
payload_s:负载长度,或为 0
l:libnet 句柄
ptag:协议标记
②构建IP包
libnet_ptag_t libnet_build_ipv4(uint16_t ip_len, uint8_t tos, uint16_t id, uint16_t frag,uint8_t ttl, uint8_t prot, uint16_t sum, uint32_t src, uint32_t dst,const uint8_t* payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
库中函数说明:
参数说明:
ip_len:ip 包总长
tos:服务类型
id:ip 标识
flag:片偏移
ttl:生存时间
prot:上层协议
sum:校验和,设为 0,libnet 自动填充
src: 源 ip 地址
dst:目的 ip 地址
payload:负载,可设置为 NULL
payload_s:负载长度,或为 0
l: libnet 句柄
ptag:协议标记
③构建以太网数据包
libnet_ptag_t
libnet_build_ethernet(const uint8_t *dst, const uint8_t *src, uint16_t type,
const uint8_t* payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
数据库说明:
参数说明:
dst:目的 mac
src:源 mac
type:上层协议类型
payload:负载,即附带的数据
payload_s:负载长度
l:libnet 句柄
ptag:协议标记
3、发送数据
int libnet_write(libnet_t *l);
4、释放资源
void libnet_destroy(libnet_t *l);
功能: 释放资源 参数: l: libnet 句柄 返回值: 无