libnet的使用详解

2023-05-16

最近搬砖需要对libnet进行介绍在这里对知识进行汇总。

1libnet简介

libnet出现以前,如果要构造数据包并发送到网络中,程序员要通过一些复杂的接口来处理。libnet的出现,为程序员提供了一个简单而易于使用的编程接口,可以帮助程序员方便地构造网络数据包,编写网络应用程序。

libnet是一个与libpcap类似的数据包注入器,可以用来编写有关网络测试、网络故障诊断和网络安全等方面的应用程序和工具。

许多网络工具 (snortNmap)都是利用它来实现其部分功能。

libnet提供一系列的接口函数,实现和封装了数据包的构造和发送过程。利用它可以亲自构造从应用层到链路层的各层协议的数据包头,并将这些包头与有效数据有序地组合在一起发送出去。当然,它也是基于TCP/IP协议网络模型的。

全部源代码包括18,000行代码,109个导出函数,其中包括67个建包函数。这使得它支持现有的TCP/IP族的所有协议。

 

2libnet的特点

libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据报的构造、处理和发送功能。libnet的开发目的是建立一个简单统一的网络编程接口以屏蔽不同操作系统低层网络编程的差别,使得程序员将精力集中在解决关键问题上。

它具有以下特点:

(1)高层接口:libnet被用于提取低 层数据报转移的专用体系结构细节。

(2)低层数据报构建:libnet的一个主要特点就是它完全控制每个数据报的头 域。

(3)可移植性的接口:与具体的操作系统平台无关。libnet目前可以在WindowsLinuxOSFreeBSDSolaris等操作系统上运行,并且提供了统一的接口。

(4)数据包构造:libnet提供了一系列的TCP/IP数据报文的构造函数以方便用户使用。

(5)数据包的处理:libnet提供了一系列处理底层网络编程的辅助函数,利用这些辅助函数,帮助用户简化那些烦琐的事务性的编程工作。

(6)数据包发送:libnet允许用户在两种不同的数据包发送方法中选择。

(7)libnet支持TCP/IP协议族中的所有协议。

libnet函数库提供的接口函数包含 15 种数据包生成器和两种数据包发送器(IP 层和数据链路层)。

提供的接口函数包括:

1)内存管理(分配和释放)函数

2)地址解析函数

3)各种协议类型的数据包构造函数

4)数据包发送函数(IP层和链路层)

5)一些辅助函数,如产生随机数、错误报告、端口列表管理等。

利用libnet函数库开发应用程序的基本步骤:

1)数据包内存初始化

2)构造数据包

3)发送数据

4)释放资源

以发送 UDP 数据包为例,流程图如图

常用函数介绍

以下函数的使用需要包含头文件libnet.h

1libnet_t *libnet_init(int injection_type, char *device, char *err_buf)

功能:

数据包内存初始化及环境建立

参数:

injection_type:构造的类型

LIBNET_LINK,链路层

LIBNET_RAW4,网络接口层(网络层)

LIBNET_LINK_ADV,链路层高级版本

LIBNET_RAW4_ADV,网络层高级版本

device:网络接口,如 "eth0",或IP地址,亦可为NULL (自动查询搜索)  

err_buf:存放出错的信息 

返回值:

成功:一个libnet *类型的指针,后面的操作都得使用这个指针 

失败:NULL

该函数初始化libnet函数库,返回一个libnet_t类型的描述符,以备随后的构造数据包和发送数据包的函数中使用。

injection_type指明了发送数据包使用的 接口类型,如数据链路层或者原始套接字等。Device是一个网络设备名称的字符串,在linux下“eth0”等。如果函数错误,返回NULLer_buf字符串中将携带有错误的原因。

2void libnet_destroy(libnet_t *l);

功能:

释放资源

参数:

llibnet_init() 返回的libnet *指针

返回值:

3char* libnet_addr2name4(u_int32_t in, u_int8_t use_name)

功能:

将网络字节序转换成点分十进制数串

参数:

in:网络字节序的ip地址        

use_name

LIBNET_RESOLVE,对应主机名

LIBNET_DONT_RESOLVE,对应点分十进制IPv4地址

返回值:

成功:点分十进制ip地址 

失败:NULL

4u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name)

功能:

将点分十进制数串转换为网络字节序ip地址

参数:

llibnet_init()返回的libnet *指针

host_name

LIBNET_RESOLVE  对应主机名

LIBNET_DONT_RESOLVE,对应点分十进制 IPv4 地址

返回值:

成功:网络字节序 ip 地址

失败:-1

5struct libnet_ether_addr* libnet_get_hwaddr(libnet_t *l)

功能:

获取接口设备硬件地址

参数:

llibnet_init()返回的libnet *指针

返回值:

成功:指向MAC地址的指针

失败:NULL

6libnet_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:目的端口号

lenudp包总长度

sum:校验和设为0libnet自动填充

payload:负载为给应用程序发送的文本内容,没有内容时可设置为 NULL

payload_s:负载长度,给应用程序发送文本内容的长度,或为0

llibnet_init()返回的libnet *指针

ptag:协议标记,第一次组新的发送包时,这里写0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。

返回值:

成功:协议标记

失败:-1

7libnet_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 winu_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:序号

ackack 标记

control:控制标记

win:窗口大小

sum:校验和,设为 0libnet 自动填充

urg:紧急指针

lentcp包长度

payload:负载,为给应用程序发送的文本内容,可设置为 NULL

payload_s:负载长度,或为 0

llibnet_init() 返回的 libnet * 指针

ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。

返回值:

成功:协议标记

失败:-1

8libnet_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 prot, u_int16 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_lenip 包总长

tos:服务类型

idip 标识

flag:片偏移

ttl:生存时间

prot:上层协议

sum:校验和,设为 0libnet 自动填充

src:源ip地址

dst:目的ip地址

payload:负载,可设置为 NULL(这里通常写 NULL

payload_s:负载长度,或为 0(这里通常写

llibnet 句柄,libnet_init()返回的libnet * 指针

ptag:协议标记,第一次组新的发送包时,这里写 0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。

返回值:

成功:协议标记  

失败:-1

9libnet_ptag_t libnet_build_ethernet(u_int8_t*dst, u_int8_t *src, u_int16_ttype, u_int8_t*payload, u_int32_tpayload_s, libnet_t*l, libnet_ptag_t ptag )

功能:

构造一个以太网数据包

参数: 

dst:目的mac

src:源mac

type:上层协议类型

payload:负载,即附带的数据,可设置为 NULL(这里通常写 NULL

payload_s:负载长度,或为 0(这里通常写

llibnet 句柄,libnet_init() 返回的 libnet * 指针

ptag:协议标记,第一次组新的发送包时,这里写0,同一个应用程序,下一次再组包时,这个位置的值写此函数的返回值。

返回值:

成功:协议标记

失败:-1

10int libnet_write(libnet_t * l)

功能:

发送数据包

参数:

llibnet 句柄,libnet_init()返回的 libnet * 指针

返回值:

成功:发送数据包的长度

失败:返回 -1

libnet的使用案例

1、在Ubuntu上安装libnet

安装命令:sudo apt-get install libnet-dev图23-2

图23-2 libnet在linux中安装

2、按照图23-1编写发送UDP数据包的代码

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 

#include <unistd.h> 

#include <libnet.h> 

 

int main(int argc, charchar *argv[]) 

{ 

    char send_msg[1000] = ""; 

    char err_buf[100] = ""; 

    libnet_t *lib_net = NULL; 

    int lens = 0; 

    libnet_ptag_t lib_t = 0; 

    unsigned char src_mac[6] = {0x00,0x0c,0x29,0x97,0xc7,0xc1};

//发送者网卡地址00:0c:29:97:c7:c1 

    unsigned char dst_mac[6] = {0x74,0x27,0xea,0xb5,0xff,0xd8};

//接收者网卡地址74-27-EA-B5-FF-D8 

    char *src_ip_str = "192.168.31.163"; //源主机IP地址 

    char *dst_ip_str = "192.168.31.248"; //目的主机IP地址 

    unsigned long src_ip,dst_ip = 0; 

 

    lens = sprintf(send_msg, "%s", "this is for the udp test"); 

 

    lib_net = libnet_init(LIBNET_LINK_ADV, NULL, err_buf);    //初始化 

    if(NULL == lib_net) 

    { 

        perror("libnet_init"); 

        exit(-1); 

    } 

 

    src_ip = libnet_name2addr4(lib_net,src_ip_str,LIBNET_RESOLVE); 

//将字符串类型的ip转换为顺序网络字节流 

    dst_ip = libnet_name2addr4(lib_net,dst_ip_str,LIBNET_RESOLVE); 

 

    lib_t=libnet_build_udp(  //构造udp数据包

8080, 8080, 8+lens, 0, send_msg, lens, lib_net, 0); 

 

    lib_t = libnet_build_ipv4(  //构造ip数据包 

20+8+lens,0,500,0,10,17, 0, src_ip,dst_ip,NULL,0,lib_net, 0); 

 

    lib_t = libnet_build_ethernet(  //构造以太网数据包 

     (u_int8_t*)dst_mac,(u_int8_t *)src_mac,0x800,NULL,0,lib_net,0); 

    int res = 0; 

    res = libnet_write(lib_net);    //发送数据包 

    if(-1 == res) 

    { 

        perror("libnet_write"); 

        exit(-1); 

    } 

 

    libnet_destroy(lib_net);    //销毁资源 

     

    printf("----ok-----\n"); 

    return 0; 

 } 

编译代码时,注意需要加上 -lnet,输入命令编译源代码,生成demo可执行文件,运行可执行文件,如图23-3

图23-3 libnet在linux中安装

3、抓包分析

利用wireshark进行抓包如图23-4

图23-4 libnet的抓包结果

可以看出成功的用libnet构造了一个UDP的数据包。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libnet的使用详解 的相关文章

  • libnet的使用详解

    最近搬砖需要对libnet进行介绍在这里对知识进行汇总 1 libnet简介 在 libnet 出现以前 xff0c 如果要构造数据包并发送到网络中 xff0c 程序员要通过一些复杂的接口来处理 libnet 的出现 xff0c 为程序员提
  • Android Handler使用详解

    handler是android给我们提供用来更新UI的一套机制 xff0c 也是一套消息处理的机制 xff0c 我们可以发送消息 xff0c 也可以通过它处理消息 它最根本的目的就是解决多线程并发问题 xff0c 假设如果在一个Activi
  • Android中ScrollView使用详解

    滚动视图 xff08 ScrollView xff09 是指当拥有很多内容 xff0c 屏幕显示不完时 xff0c 需要通过滚动来显示完整的视图 包括水平滚动视图 xff08 HorizontalScrollView xff09 和垂直滚动
  • Log4J使用详解(整理)

    1 Log4j是什么 Log4j是Apache的一个开源项目 xff0c 通过使用Log4j xff0c 我们可以控制日志信息输送的目的地是控制台 文件 GUI组件 xff0c 甚至是套接口服务器 NT的事件记录器 UNIX Syslog守
  • libnet编译linux,redhart linux下如何安装libnet

    我的安装过程如下 xff1a tar xvzf libnet tar cd libnet configure make make install libpcap已按此法先行安装了 如此安装之后 xff0c man libnet name r
  • Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上 xff0c 给我们带来了更加详细的Material Design设计规范 xff0c 同时 xff0c 也给我们带来了全新的Andro
  • Mybatis中注解@MapKey的使用详解

    MyBatis查询一些记录 xff0c 数据涉及到两个表里的数据 xff0c 需要连表查询 xff0c 但我MyBatis的返回结果不想创建新的DO对象 xff0c 因此使用 64 MapKey注解返回一个Map集合 含义 xff1a 64
  • Log4Net使用详解(续)

    说明自从上次在2008年在博客上发表过有关log4net的用法介绍文章之后 xff08 网址 xff1a http blog csdn net zhoufoxcn archive 2008 03 26 2220533 aspx xff09
  • ButterKnife与BindView使用详解

    ButterKnife与BindView使用详解 ButterKnife的优势 具有强大的view绑定和click事件处理能力 方便处理Adapter里的viewHolder绑定问题 运行时不会影响app效率 xff0c 配置方便 代码清晰
  • 断言ASSERT使用详解

    一 assert的定义 原以为assert 仅仅是个报错函数 xff0c 事实上 xff0c 它居然是个宏 xff0c 并且作用并非 34 报错 34 在经过对其进行一定了解之后 xff0c 对其作用及用法有了一定的了解 xff0c ass
  • iOS之UITableViewController使用详解(一)tableview上移

    tableview上移解决 xff1a self edgesForExtendedLayout 61 UIRectEdgeNone if 64 available iOS 11 0 UIScrollView appearance setCo
  • fork()使用详解

    fork xff08 xff09 使用详解 摘自 xff1a https blog csdn net u014082714 article details 45031771 一 fork入门知识 进程的定义 xff1a 进程是一个执行中的程
  • OKHttp使用详解

    1 简介 OkHttp 是一个默认高效的 HTTP 客户端 xff1a HTTP 2 支持允许对同一主机的所有请求共享一个套接字 连接池减少了请求延迟 xff08 如果 HTTP 2 不可用 xff09 透明 GZIP 缩小了下载大小 响应
  • RestTemplate 使用详解

    一 简介 常见的http客户端请求工具 xff1a JDK 自带 HttpURLConnectionApache HttpClientOKHttp 以上 工具虽然常用 xff0c 但对于 RESTful 操作相对不是太友好 所以 xff0c
  • 项目管理:代码检查 pre-commit 使用详解

    Git钩子脚本对于在提交代码审查之前识别简单问题很有用 我们在每次提交时都运行钩子 xff0c 以自动指出代码中的问题 xff0c 例如缺少分号 xff0c 尾随空白和调试语句 通过在代码审阅之前指出这些问题 xff0c 代码审阅者可以专注
  • ROS nodelet 使用详解

    本文以nodelet tutorial math为例来了解nodelet的原理及使用方法 xff0c 理论知识参考http blog csdn net zyh821351004 article details 52143309 代码地址 x
  • SKlearn里面的K-means使用详解

    在K Means聚类算法原理中 xff0c 我们对K Means的原理做了总结 xff0c 本文我们就来讨论用scikit learn来学习K Means聚类 重点讲述如何选择合适的k值 1 K Means类概述 在scikit learn
  • Qt QMessageBox使用详解

    本文详细的介绍了QMessageBox控件的各种操作 xff0c 例如 xff1a 消息提示框的使用 判断消息提示框的按钮 标准图标和自定义图标 定时关闭 自定义样式等操作 本文作者原创 xff0c 转载请附上文章出处与本文链接 Qt QM
  • Netty框架之Selector使用详解

    谈到Selector的具体使用 xff0c 那么就要结合BIO NIO的知识讲解 xff0c Selector使用在非阻塞模式NIO场景下 xff0c 学习NIO之前先要了解BIO原理 xff0c 下面我们一步步讲解 一 BIO Block
  • HttpUrlConnection使用详解

    一 xff0c HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一 xff0c Android SDK中对HTTP 超文本传输协议 也提供了很好的支持 xff0c 这里包括两种接口 1 标准Java接

随机推荐

  • 用jupyter notebook修改.md文件后,遇见的问题:Jupyter上无法保存md文件; FileNotFoundError: [Errno 2] No such file or direc

    回顾 xff1a github找的的学习资料进行学习 xff0c 强行想要在jupyter notebook中阅读 md 文件 xff0c 参考链接Jupyter notebook 查看Markdown md文件 tuzixini的博客 C
  • 多生产者单消费者捆绑消费问题

    1 问题描述 某商店有两种食品A和B 最大数量各为m个 该商店将A B两种食品搭配出售 xff0c 每次各取一个 为避免食品变质 xff0c 遵循先到食品先出售的原则 xff0c 有两个食品公司分别不断地供应AB两种食品 xff08 每次一
  • OpenCV3的程序转到OpenCV4下进行编译出现的一些问题解决方法

    文章目录 写在前面一 报错 96 CV INTER LINEAR was not declared in this scope 96 1 问题描述2 解决方法 二 报错 96 CV RANSAC was not declared in th
  • c# http请求使用multipart/form-data 方式上传文件及其他参数

    这次的需求是请求java那边的一个excel批量上传的接口 但是他们的接口要求是这样的 于是自己写了个方法 xff1a 调用 xff1a 控制器层 var file 61 this HttpContext Request Files 0 获
  • C++设计模式七、生产者消费者模式(单生产单消费)。

    前言 xff1a 生产者消费者模式在 大话设计模式 一书中并没有涉及 可奈何在工作中很多地方都要用到 此模式的例子基本都相似 xff0c 在网上找了一篇博客 xff08 原文 xff09 xff0c 在此进行剖析 xff0c 写此篇博文学习
  • 网络爬虫-cloudflare五秒等待验证逆向破解

    Cloudflare是国外的一家安全防护公司 xff0c 最近在很多网站上也看到了他的身影 xff0c 比较明显的特征就是让你等待5秒钟以验证你是否是真实的浏览器 以 https www biovision com 为例 另一个明显的特征就
  • VNC的使用

    1 安装 yum install tigervnc server x86 64 2 配置 客户机和远程vnc桌面间的复制粘贴 参考 xff1a VNC怎么和宿主机共享粘贴板 整理 cxcbupt CSDN博客 3 日常使用 1 解决远程桌面
  • WPF异常处理详解

    总目录 文章目录 总目录一 WPF异常1 未捕获异常2 模拟未捕获异常场景 二 处理未捕获异常1 DispatcherUnhandledException 异常捕获2 UnhandledException异常捕获3 UnobservedTa
  • javafx 多线程赛马设计

    根据上一篇博客的内容 xff0c 这篇将展示设计过程 xff1a 二 xff0e 概要设计 2 1 系统流程图 2 2 功能模块图 2 3 赛马程序模拟程序初始化模块 在这一模块当中 xff0c 要求使用者选择当局需要赛马的马匹数量 xff
  • Cannot find module 'vue-loader/lib/plugin'

    安装了 webpack4 的版本之后发现报这个错 Cannot find module vue loader lib plugin 然后上node modules 里找了一下还真没有 plugin xff0c 所以我肯定是 vue load
  • ubuntu16.04 安装配置python3.6

    在Ubuntu下 xff0c 时不时会有这个错误的 add apt repository command not found 这个是缺少程序 xff0c 安装一下就可以了 只是不知道安装的名字 按以下命令走一趟就可以的了 sudo apt
  • 最新最快最简单解决rosdep更新失败问题

    在安装ros的时候 xff0c 最后一步会由于源在国外 xff0c sudo rosdep init会失败 xff0c 其中一种方式是通过加https ghproxy com 代理的方式 xff0c 参考链接 我之前也都是这样做的 xff0
  • 解决wsl无法同步本地代理的dns信息

    问题 本地开了公司的vpn xff0c 使用vscode的remote wsl插件连接wsl1 xff0c 结果wsl里面无法解析公司内部的一些域名 xff0c 查了下发现原来是wsl无法自动同步本地代理的dns信息 wsl2没有这个问题
  • 如何在Oracle官网下载jdk

    Oracle官方网址 xff1a Oracle Cloud Applications and Cloud Platform 注册账号 xff1a 登录进入首页 xff1a 点击Products xff1a 来到Products页面 xff0
  • ubuntu安装字体

    先安装 span class token function sudo span span class token function apt get span span class token function install span y
  • windows 压缩指定目录下每个目录和文件为zip文件的powershell脚本

    某个文件夹下有几十个子文件夹 xff0c 想要单个压缩每个子文件夹备份到云盘 如果手动操作会有点累 xff0c 尝试写个脚本吧 版本 适用于win10 win11 其他版本未测试 一 编写脚本 众所周知windows下有两种自带脚本cmd和
  • SpringMVC的配置和执行流程

    要想成功的配置和调试springmvc xff0c 了解掌握它的执行流程是必不可少的 xff0c 话不多说 xff0c 看下图 xff1a 我们边说执行边讲配置 xff0c 首先 xff0c 想要使用springmvc xff0c 依赖是必
  • Maven安装与配置详解、多镜像节点的配置

    下载 Maven是Apache下面的一个项目 xff0c 官网下载地址 xff1a https maven apache org download cgi 历史版本下载地址 xff1a https archive apache org di
  • 使用FTPClient上传文件到ftp服务器。并解决图片损坏问题。

    1 先借鉴此博客的方法 xff08 此博客的方法上传txt文件没有问题 xff0c 但是上传的图片文件会损坏 xff09 https blog csdn net weixin 37196194 article details 5500166
  • libnet的使用详解

    最近搬砖需要对libnet进行介绍在这里对知识进行汇总 1 libnet简介 在 libnet 出现以前 xff0c 如果要构造数据包并发送到网络中 xff0c 程序员要通过一些复杂的接口来处理 libnet 的出现 xff0c 为程序员提