简单了解后,建议直接查看源码,以获得其他函数:libnet: libnet-functions.h File Reference
本文仅列举个别常用函数
libnet工作流程
(1)通过libnet_init()函数进行初始化,建立libnet context;
(2)从高层到低层建立报头。例如,建立UDP数据包时,调用函数的顺序如下:libnet_build_udp(), libnet_build_ipv4(), libnet_build_ethernet();
(3)调用libnet_write()写入数据包,发送;
(4)准备发送新的数据包,一般而言,有以下两种方式:
(4.1)调用libnet_clear_packet()清除之前发送的数据包,回到第(2)步;
(4.2)接着上次发送的数据包继续发送:即回到第(2)步,并使用相同函数更新数据包,但是现在所使用的数据包tag是上次发送数据包后所返回的tag;
(5)完成所有数据包发送工作,调用libnet_destroy()清除libnet context,退出。
一般函数
libnet_init
libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
功能:数据包内存初始化及环境建立
参数:
injection_type:构造的类型,如下4种
LIBNET_LINK,链路层
LIBNET_RAW4,网络接口层(网络层)
LIBNET_LINK_ADV,链路层高级版本
LIBNET_RAW4_ADV,网络层高级版本
device:网络接口,如 "eth0",或IP地址,亦可为NULL (自动查询搜索)
err_buf:存放出错的信息
---------------------------------------------------------------------------------------------------------------------------------
libnet_name2addr4
u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name)
功能:将点分十进制数串转换为网络字节序ip地址
参数:
l:libnet_init()返回的libnet *指针
host_name:
LIBNET_RESOLVE,对应主机名
LIBNET_DONT_RESOLVE,对应点分十进制IPv4地址
返回值:
成功:网络字节序 ip 地址
失败:-1
例子:
char* src_ip_str = "192.168.44.130";
unsigned long src_ip = 0;
src_ip = libnet_name2addr4(lib_net, src_ip_str, LIBNET_RESOLVE);
有多种格式转换函数
注意格式转换的灵活使用
// ip地址有两种表示格式,字符串或数字,以下函数用于对两种表示格式进行相互转换,其中use_name表示LIBNET_RESOLVE或LIBNET_DONT_RESOLVE
char * libnet_addr2name4(uint32_t in, uint8_t use_name);
uint32_t libnet_name2addr4(libnet_t *l, char *host_name, uint8_t use_name);
struct libnet_in6_addr libnet_name2addr6(libnet_t *l, const char *host_name, uint8_t use_name);
void libnet_addr2name6_r(struct libnet_in6_addr addr, uint8_t use_name, char *host_name, int host_name_len);
---------------------------------------------------------------------------------------------------------------------------------
libnet_write
int libnet_write(libnet_t *l);
功能:发送数据到网络
参数:l:libnet句柄
返回值:失败返回-1,成功返回其他。
---------------------------------------------------------------------------------------------------------------------------------
libnet_destroy
void libnet_destroy(libnet_t *l);
功能:释放资源
参数:l:libnet句柄
返回值:无
数据包构造函数
libnet_build_udp
libnet_ptag_t libnet_build_udp(u_int16_t sp,
u_int16_t dp,
u_int16_t len,
u_int16_t sum,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag);
功能:构造UDP数据包
参数:
sp:源端口号
dp:目的端口号
len:UDP包总长度(8+负载长度,UDP首部8B(LIBNET_UDP_H))
sum:校验和,设为0,libnet自动填充
payload:负载,可设置为NULL
payload_s:负载长度,或为0
l:libnet句柄
ptag:协议标记
返回值:成功返回协议标记;失败返回-1
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_tcp
libnet_ptag_t libnet_build_tcp(u_int16_t sp,
u_int16_t dp,
u_int32_t seq,
u_int32_t ack,
u_int8_t control,
u_int16_t win,
u_int16_t sum,
u_int16_t urg,
u_int16_t len,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag );
功能:构造tcp 数据包
参数:
sp:源端口号
dp:目的端口号
seq:TCP序号
ack:ack确认号
control:TCP控制位
win:窗口大小
sum:校验和,设为 0,libnet 自动填充
urg:紧急指针
len:tcp包长度
payload:负载,为给应用程序发送的文本内容,可设置为 NULL
payload_s:负载长度,或为0
l:libnet_init() 返回的 libnet * 指针
ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_tcp_options
libnet_ptag_t libnet_build_tcp_options(const uint8_t *options,
uint32_t options_s,
libnet_t *l,
libnet_ptag_t ptag)
设置TCP选项字段
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_icmp_echo
icmp request/reply(Type=8,Type=0)
libnet_ptag_t libnet_build_icmpv6_echo(uint8_t type,
uint8_t code,
uint16_t sum,
uint16_t id,
uint16_t seq,
uint8_t *payload,
uint32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag)
Type:8或0,表请求/回复报文
Code:据抓包,可取0
Sum:校验和,0
Id:据抓包,可取0
Seq:据抓包,可取0
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_ipv4
libnet_ptag_t libnet_build_ipv4(u_int16_t ip_len,
u_int8_t tos,
u_int16_t id,
u_int16_t flag,
u_int8_t ttl,
u_int8_t port,
u_int16_t sum,
u_int32_t src,
u_int32_t dst,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag);
功能:构造一个IPv4数据包
参数:
ip_len:ip包总长(20+UDP包长,IP数据包首部20B(LIBNET_IP_H))
tos:服务类型,一般不设
(参考https://blog.csdn.net/wangzhen209/article/details/74453548)
id:ip标识(相同的标识字段的值使分片后的各数据报片最后能正确地重装为原来的数据报)
flag:片偏移(分片时需要)
ttl:生存时间
prot:上层协议号,十进制,(可用内置常量)
sum:校验和,设为0,libnet自动填充
src:源IP地址
dst:目的IP地址
payload:负载,可设置为NULL
payload_s:负载长度,或为0
l:libnet句柄
ptag:协议标记
返回值:成功返回协议标记;失败返回-1
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_ipv4_options
libnet_ptag_t libnet_build_ipv4_options(const uint8_t *options,
uint32_t options_s,
libnet_t *l,
libnet_ptag_t ptag)
暂缺介绍
---------------------------------------------------------------------------------------------------------------------------------
libnet_build_ethernet
libnet_ptag_t libnet_build_ethernet(u_int8_t *dst,
u_int8_t *src,
u_int16_t type,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag);
功能:构造一个以太网数据包
参数:
dst:目的mac
src:源mac
type:上层协议类型(当类型字段的值是0x0800时,就表示上层使用的是IP数据报)
payload:负载,即附带的数据
payload_s:负载长度
l:libnet句柄
ptag:协议标记
返回值:成功返回协议标记;失败返回-1
内置常量
数据包头大小常量
LIBNET_ARP_H 28
LIBNET_DNS_H 12
LIBNET_ETH_H 14
LIBNET_ICMP_H 4
LIBNET_ICMP_ECHO_H 8
LIBNET_ICMP_MASK_H 12
LIBNET_ICMP_UNREACH_H 8
LIBNET_ICMP_TIMXCEED_H 8
LIBNET_ICMP_REDIRECT_H 8
LIBNET_ICMP_TS_H 20
LIBNET_IGMP_H 8
LIBNET_RIP_H 24
LIBNET_TCP_H 20
LIBNET_UDP_H 8
---------------------------------------------------------------------------------------------------------------------------------
数据包内存常量
LIBNET_PACKET TCP/UDP数据包头 + IP数据包头使用的内存
LIBNET_OPTS IP或TCP选项使用的内存
LIBNET_MAX_PACKET IP_MAXPACKET (65535字节)使用的内存
---------------------------------------------------------------------------------------------------------------------------------
随机数发生器常量
libnet_get_prand()函数使用:
LIBNET_PRAND_MAX 65535
LIBNET_PR2 0 - 2
LIBNET_PR8 0 - 255
LIBNET_PR16 0 - 32767
LIBNET_PRu16 0 - 65535
LIBNET_PR32 0 - 2147483647
LIBNET_PRu32 0 - 4294967295
---------------------------------------------------------------------------------------------------------------------------------
错误消息常量
(libnet_error()函数使用):
LIBNET_ERR_WARNING 警告类型消息
LIBNET_ERR_CRITICAL 紧急类型消息
LIBNET_ERR_FATAL 致命错误消息
---------------------------------------------------------------------------------------------------------------------------------
上层协议值常量
Build_ip用
IPPROTO_TCP
IPPROTO_UDP
------------------------
build_ethernet用
ETHERTYPE_IP
---------------------------------------------------------------------------------------------------------------------------------
部分函数使用的常量
函数:libnet_host_lookup()、libnet_host_lookup_r()和libnet_name_resolve()
LIBNET_DONT_RESOLVE 不将IP地址解析为FQDN名
LIBNET_RESOLVE 尝试将IP地址解析为FQDN名
参考
libnet 1.1核心功能及常用函数(备忘录)_csdidi的博客-CSDN博客
libnet的使用详解_Kopoo_的博客-CSDN博客_libnet
网络编程第三方库——Libnet库(发送)_陈小帅hh的博客-CSDN博客_libnet
UDP数据包结构_cang12345的博客-CSDN博客_udp数据包结构
IP数据报格式详解_believe209的博客-CSDN博客_ip数据报的格式
tcp数据包的介绍_一十六笔画生的博客-CSDN博客_tcp数据包
libnids,libnet,libicmp使用简介_ape_neu的博客-CSDN博客
网络安全工具开发函数库介绍之一——libnet_shuinieh的博客-CSDN博客