亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议。

0x0800 ip

0x0806 arp

0x86DD    IPv6

0x86ee     idmp了

至于ipv6的包的话 在那就不需要改了

只有协议号需要改

我最后安装的是libnet-1.1.4.tar.gz

可用编译的时候gcc -o libnet libnet.c -lnet

安装完了 /usr/include/libnet.h里面就有了

除了下面这个例子中一次一个数据包libnet也提供了多数据包内存初始化

int libnet_init_packet_arena(struct libnet_arena **arena,

u_short packet_num, u_short packet_size);

/************************************************************

补充1   ARP包的格式

一个ARP包是分为两个部分的,前面一个是物理帧头,后面一个才是ARP帧。

首先,物理帧头,它将存在于任何一个协议数据包的前面,我们称之为DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的物理地址,以便硬件设备识别。

DLC Header
    字段        长度(Byte)        默认值                   备注
接收方MAC        6              广播时,为ff-ff-ff-ff-ff-ff  
发送方MAC        6            
  Ethertype         2             0x0806           0x0806是ARP帧的类型值


以上是需要我们填充的物理帧头的格式,我们可以看到需要我们填充的仅仅是发送端和接
收端的物理地址,接下来我们看一下ARP帧的格式.

ARP Frame

字段        长度(Byte)         默认值                  备注
硬件类型           2              0x1                 以太网类型值
上层协议类型        2             0x0800             上层协议为IP协议
MAC地址长度        1              0x6              以太网MAC地址长度为 6
IP地址长度         1              0x4                IP地址长度为 4
  操作码            2                          0x1表示ARP请求包,0x2表示应答包 
发送方MAC          6
发送方IP           4
接收方MAC          6
接收方IP           4
填充数据           18

************************************************************
/

/************************************************************
               文档:linux下libnet编程
              作者:Alanx
          Email:zhangsuozhu@tom.com
          版本: 0.01
    本文档Alanx所有,转载请注明!!!
    本文源代码参考libnet例子代码及arpoison源代码
**************************************************************/
一、下载安装libnet
我下的是1.13RC01版的。很简单,下载下来解开.
./configure
make
make install
即可(注意,在root权根下安装)
二、编程
1、#include <libnet.h>把库导入进来!
2、关于IP的数据结构。
IP为32位无符号整型、可以用以下类型:          
u_int32_t 或u_long
可以用 inet_addr("192.168.0.1")把字符型的指针或数组转换成IP地址。
3、关于MAC的数据结构
MAC的数据结构是6个8位的数组,每个数组中记录的一个十六进制的数据,共48位的硬件地址。
struct macaddr
{
       u_char   MAC[6]; /*   或u_int8_t MAC[6] */
};
4、初始化libnet,分配内存函数 libnet_init( )
char device[ ]="eth0";/*这是网卡的名子*/
char errbuf[LIBNET_ERRBUF_SIZE];//如果程序中出错。出错信息都保存在该数据中。
libnet_t     *plibnet_app;
plibnet_app=libnet_init(LIBNET_LINK_ADV, device, errbuf);//第一个参数设定这个实列是在链路层工作,还是在IP层工作。
/*出错处理*/
if (NULL ==plibnet_app)
{
        printf("libnet_init: error %s\n", errbuf);
        exit(1);
}
/*出错处理*/
该函数返回一个libnet的实例指针,以后听数据包的构建及发送都要用到该实例指针。也许实例不准确,也可以说是句柄。随他怎么说吧。反证以是分配了内存。并提供给我们了一个指针。其它函数可以调用这个指针,向libnet_t这个数扰结构里写一些内存。
5、制造数据包
本着先高层后低层的顺序。比如ARP数据包。我们先构造ARP包。然后在构造ETHERNET的数据包。
这里我们以新建一个ARP数据包为例:
首先先调用:libnet_build_arp()该函数返回一个libnet_ptag_t类型的值。来表示是否建立成功。不成功返回-1。其实libnet_ptag_t的数据类型估计是整型啥的。可以不考虑。只要不是返回-1,就说明APR数据包构造成功了。
例如下:
libnet_ptag_t      ptag;
ptag = libnet_build_arp(
                1,                  /* hardware type */
                0x0800,             /* proto type */
                6,                  /* hw addr size */
                4,                  /* proto addr size */
                ARPOP_REPLY,                 /* ARP OPCODE */
                SrcMAC,                 /* source MAC addr */
                (u_char *)&SrcIP,       /* src proto addr */
                DstMAC,                /* dst MAC addr */
                (u_char *)&DstIP,       /* dst IP addr */
                NULL,               /* no payload */
                0,                  /* payload length */
            plibnet_app,            /* libnet tag */
        0);            /* ptag see man */
/*出错处理*/
if (-1==ptag) /* 把-1写在前面是怕我们粗心的写成 ptag=-1 */
{
        perror("libnet_build_arp");
        exit(1);
}
/*出错处理*/
以上代码基本上只注意其中的几个参数就可以了:
ARPOP_REPLY    这个参数是个宏也可以是 ARP_REQUEST;表明是ARP查询还是应达。
SrcMAC 指向源MAC数组的指针
DesMAC 指向目地MAC数组的指针
SrcIP      指向源IP地址的指针
DstIP      指向目地IP地直的指针
plibnet_app 刚才我们初始化libnet返回的指针
接下来。我们构造这个ARP包的底层,也就是物理层的数据。一般是ethernet层的ethernet 头数据包。用函数libnet_build_ethernet( );
这个函数很简单同上。也返回一个 libnet_ptag_t的值。如果是-1,说明失败。
libnet_ptag_t eth_tag;
eth_tag = libnet_build_ethernet(
                DstMAC,         /* dst MAC addr */
                SrcMAC,         /* src MAC addr */
                0x0806,         /* ether packet type */
                NULL,           /* ptr to payload */
                0,              /* payload size */
                plibnet_app,
        0);        /* ptr to packet memory */
/*出错处理*/
if (-1 == eth_tag)
{
        perror("libnet_build_ethernet");
        exit(1);
}
/*出错处理*/
同样只注意 DstMAC ,SrcMAC , plibnet_app三个数据就可以了。
6、发送数据包。一般用一个无限的循环 如:
int n;/*n==-1时没有发送成功*/
for(;;)
{
n= libnet_write(plibnet_app);
/*出错处理*/
if(-1==n)printf("lost packet\n");
/*出错处理*/
};
7、释放内存。
libnet_destroy(plibnet_app);
三、编译
gcc 源文件.c -o 目标文件 -lnet
四、回顾一下上面的知识。写一个小程序。(注意,这里没有错误检查,为的是让代码更短小)
#include <libnet.h>
int main()
{
    char device[ ]="eth1";
    u_int32_t srcip, desip;
        u_char srcmac[6]={0x11,0x11,0x11,0x11,0x11,0x11};
    u_char desmac[6]={0x22,0x22,0x22,0x22,0x22,0x22};
        libnet_t *plibnet_app;
    char errbuf[100];
        plibnet_app=libnet_init(LIBNET_LINK_ADV, device, errbuf);
/********************************************************************************
下面填充要构造的数据包的内容
要源IP地址:192.168.18.10          MAC地址:11:11:11:11:11:11
目标IP地址:192.168.18.1            MAC地址:22:22:22:22:22:22
源IP向目地IP发送应答包。应答192.168.18.10的MAC地址为11:11:11:11:11:11
**********************************************************************************/
    srcip=inet_addr("192.168.18.10");
    desip=inet_addr("192.168.18.1");
/*************************** 以下开始构造ARP包 及ETHERNET包头 **************************************/
    libnet_build_arp(     ARPHRD_ETHER,//hardware addr
                ETHERTYPE_IP,//protocol addr
                6,//hardware addr size
                4,//protocol addr size
                ARPOP_REPLY,//operation type
                (u_int8_t*)&srcmac,//sender hardware addr (u_int8_t point)
                (u_int8_t *)&srcip,//sender protocol addr(u_int8_t point)
                (u_int8_t*)&desmac,//target hardware addr(u_int8_t point)
                (u_int8_t *)&desip,//target protocol addr(u_int8_t point)
                NULL,//payload
                0,//payload size
                plibnet_app,//libnet handle
                0/*libnet id*/);
    libnet_build_ethernet(    desmac,//des HW addr*
                srcmac,//src HW addr*
                   0x0806,//ether packet type
                NULL,//prt to payload
                0,//payload size
                plibnet_app,//libnet handle
                0);//ptr toi packet memory   
/**********************************      构造完成。开始发包      **************************************/
    for(;;)
        {    
            //libnet_adv_cull_packet(plibnet_app, &packet, &packet_size);
            libnet_write(plibnet_app);
            printf("Send ARP Packet\n");
            sleep(1);
        };
/***********************************结束********************************************/
    libnet_destroy(plibnet_app);
    return 0;
}
/***********************************UBUNTU7.10, libnet1.13RC01下调试通过*********************************************
                      gcc test.c -o test -lnet
              ./test
产生的数据,用Wireshark抓包得到如下结果
0000    22 22 22 22 22 22 11 11 11 11 11 11 08 06 00 01   """""".. ........
0010    08 00 06 04 00 02 11 11 11 11 11 11 c0 a8 12 0a   ........ ........
0020    22 22 22 22 22 22 c0 a8 12 01                     """""".. ..     
************************************注意你的网卡一般是eht0。我的网卡名是eth1********************************************/

转载于:https://www.cnblogs.com/coffeepri/archive/2012/05/21/2511265.html

linux下libnet编程 亲自测试可用相关推荐

  1. Linux 下串口编程(C++ 程序设计)

    串口通信是最简单的通信方式.即使在USB 非常流行的今天,依然保留了串行通信的方式.网络上已经有大量关于Linux下 C++ 串口编程的文章,但是我依然要写这篇博文.因为网络上的资料不是内容太多,就是 ...

  2. Linux下Socket编程

    Linux下Socket编程    网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的S ...

  3. Linux下高性能网络编程中的几个TCP/IP选项

    Linux下高性能网络编程中的几个TCP/IP选项 转自:http://blog.chinaunix.net/u/12592/showart.php?id=2064847 最近在新的平台上测试程序,以 ...

  4. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  5. linux下Bash编程until语句及格式化硬盘分区等编写脚本(十)

    linux下Bash编程until语句及格式化硬盘分区等编写脚本(十) 1.循环语句结构总结 1.1.while语句当条件满足时,进入循环语句 while 条件; do 语句 done 1.2.unt ...

  6. shell for循环1到100_浅谈Linux下shell 编程的for循环常用的6种结构

    浅谈Linux下shell 编程的for循环常用的6种结构 1. 常用for循环结构 (1) for 变量 in 值1 值2 值3... do 程序块儿 done (2) for 变量 in `命令` ...

  7. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  8. LINUX下Socket编程 函数格式详解

    你需要了解的一些系统调用: socket() bind() connect() listen() accept() send() recv() sendto() recvfrom() close() ...

  9. Linux下thread编程

    From: http://blog.sina.com.cn/s/blog_602f87700100dqmk.html Linux下thread编程(一) Sam前些天在提供一个库给别的公司时,因为不喜 ...

  10. Linux下串口编程

    文章目录 串口 驱动 安装 设备文件 测试代码 编译运行 引用 串口 电平之类的就不说了,串口使用的一般包括rs232全双工,rs422四线全双工,rs485两线半双工,rs485四线全双工几种模式, ...

最新文章

  1. Flume的安装与配置
  2. 一个横空出世用于下载TCGA、GEO、ICGC数据于一体的工具
  3. 量子计算机多少量子,中国“夺回”量子霸权:世界上最快的量子计算机
  4. 一款基于jquery的下拉点击改变背景图片
  5. python requests post请求_Pythonrequest发送post请求
  6. Blazor 事件处理开发指南
  7. Redis精进:List的使用和应用场景
  8. C++编程语言中的值传递(pass-by-value)和引用传递(pass-by-reference)介绍
  9. 快速乘 防爆乘 快速幂
  10. 魔兽怀旧服服务器位置,魔兽世界怀旧服PDD在哪个服务器 魔兽世界怀旧服pdd去哪个区...
  11. 均值滤波器类型_[数字图像处理]图像去噪初步(1)--均值滤波器
  12. 冯扬文:基于数据仓库的集装箱运价信息集成研究
  13. python 描述性分析_python数据分析:美国巴尔的摩16年公务员工资数据集描述性分析...
  14. Ubuntu 下安装 Python 解释器
  15. java爬虫(爬取豆瓣电影排行榜)
  16. Linux:UID和EUID
  17. MySQL权限系统(三).权限表 Grant Tables
  18. Dynamo For Revit: List 连缀 和 Level
  19. 中国互联网CEO语录
  20. 用java画爱心图_用java输出一个心型图案

热门文章

  1. 分析redis key大小的几种方法
  2. scanner python_Python之Scanner编写
  3. 8.1并发集合(Concurrent Collections)
  4. 4.3定时器框架(Timer Framework)
  5. 用gcc3.4.5编译c++项目
  6. PETS:伯克利大神Sergey Levine指导的概率集成轨迹采样算法
  7. 9个JQuery和5个JavaScript经典面试题
  8. 03.Java语言基础
  9. LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
  10. LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误