Libnet简单学习

本文详细介绍了Libnet库的工作流程,包括libnet_init()初始化、构建不同层次的数据包(如UDP、TCP、ICMP等)、libnet_write()发送数据包以及libnet_destroy()释放资源。此外,还列举了常用函数如libnet_name2addr4()的IP地址转换、libnet_build_udp()构建UDP包等,并提到了各种数据包头大小常量和内存常量。
摘要由CSDN通过智能技术生成

简单了解后,建议直接查看源码,以获得其他函数: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_IPV4_H 20

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_ICMP

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 TCP示例_程序员_IT虾米网

libnet 函数列表_Mike江的博客-CSDN博客

网络安全工具开发函数库介绍之一——libnet_shuinieh的博客-CSDN博客

libnet的发多个数据包问题,高手的请进!我跪求了,做牛做马在所不辞!1000分求助!-CSDN论坛

源码:libnet: libnet-functions.h File Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值