一、发送arp数据包

#include <stdio.h>
#include <libnet.h>
int main()
{   int res;   /*********init paras*****************/  libnet_t *l;/*****libnet handler*/  libnet_ptag_t p_tag;   char *device="eth0";   char err_buff[LIBNET_ERRBUF_SIZE];   char *src_ip_str="192.168.85.129";   char *dest_ip_str="192.168.85.132";   u_char src_mac[6]={0x00,0x1c,0xf9,0x6a,0x4c,0x00};   u_char dest_mac[6]={0xff,0xff,0xff,0xff,0xff,0xff};   u_long src_ip;   u_long dest_ip;   src_ip=libnet_name2addr4(l,src_ip_str,LIBNET_RESOLVE);   dest_ip=libnet_name2addr4(l,dest_ip_str,LIBNET_RESOLVE);   /**********init libnet*****************/  l=libnet_init(   LIBNET_LINK_ADV,   device,   err_buff   );   //开启系统的网络功能if(l==NULL)   {   printf("libnet_init err!\n");   fprintf(stderr,"%s",err_buff);   exit(0);   }   /**********build arp packet************/  p_tag=libnet_build_arp(   ARPHRD_ETHER,/*hardware type ethernet*/  ETHERTYPE_IP,/*protocol type*/  6,/*length of mac*/  4,/*length of IP*/  ARPOP_REPLY,/*ARP operation type*/  src_mac,   (u_int8_t*) &src_ip,   dest_mac,   (u_int8_t*) &dest_ip,   NULL,/*payload*/  0,/*payload size*/  l,/*libnet handler*/  0/*'0' stands out building a new packet*/  );   if(p_tag==-1)   {   printf("libnet_build_arp err!\n");   exit(0);   }   /***********build ethernet packet header*************/  p_tag=libnet_build_ethernet(   dest_mac,   src_mac,   ETHERTYPE_ARP,   NULL,   0,   l,   0   );   if(p_tag==-1)   {   printf("libnet_build_ethernet err!\n");   exit(0);   }   /*********send packets*******************************/int j;  int num=5;for(j=0;j<num;j++)   {   if((res=libnet_write(l))==-1)   {   printf("libnet_write err!\n");   exit(0);   }   printf("arp packet has been sent\n");   sleep(1);   }   /*********over and destroy**************************/  libnet_destroy(l);   //关闭使用的网络通讯设备return 0;
} 

二、发送tcp数据包

#include <libnet.h>int main() {libnet_t *handle; /* Libnet句柄 */int packet_size; /* 构造的数据包大小 */char *device = "eth0"; /* 设备名字,也支持点十进制的IP地址,会自己找到匹配的设备 */char *src_ip_str = "192.168.85.129"; /* 源IP地址字符串 */char *dst_ip_str = "192.168.85.132"; /* 目的IP地址字符串 */u_char src_mac[6] = {0x00, 0x0c, 0x29, 0xc0, 0xd0, 0xcd}; /* 源MAC */u_char dst_mac[6] = {0x00, 0x0c, 0x29, 0x24, 0x6b, 0x77}; /* 目的MAC */u_long dst_ip, src_ip; /* 网路序的目的IP和源IP */char error[LIBNET_ERRBUF_SIZE]; /* 出错信息 */libnet_ptag_t eth_tag, ip_tag, tcp_tag, tcp_op_tag; /* 各层build函数返回值 */u_short proto = IPPROTO_TCP; /* 传输层协议 */u_char payload[255] = {0}; /* 承载数据的数组,初值为空 */u_long payload_s = 0; /* 承载数据的长度,初值为0 *//* 把目的IP地址字符串转化成网络序 */dst_ip = libnet_name2addr4(handle, dst_ip_str, LIBNET_RESOLVE);/* 把源IP地址字符串转化成网络序 */src_ip = libnet_name2addr4(handle, src_ip_str, LIBNET_RESOLVE);/* 初始化Libnet */if ( (handle = libnet_init(LIBNET_LINK, device, error)) == NULL ) {printf("libnet_init failure\n");return (-1);};strncpy(payload, "test", sizeof(payload)-1); /* 构造负载的内容 */payload_s = strlen(payload); /* 计算负载内容的长度 */#if 0/* 构建TCP的选项,通常在第一个TCP通信报文中设置MSS */tcp_op_tag = libnet_build_tcp_options(payload,payload_s,handle,0);if (tcp_op_tag == -1) {printf("build_tcp_options failure\n");return (-2);};
#endiftcp_tag = libnet_build_tcp(30330,                    /* 源端口 */30331,                    /* 目的端口 */8888,                    /* 序列号 */8889,                    /* 确认号 */TH_PUSH | TH_ACK,        /* Control flags */14600,                    /* 窗口尺寸 */0,                        /* 校验和,0为自动计算 */0,                        /* 紧急指针 */LIBNET_TCP_H + payload_s, /* 长度 */payload,                    /* 负载内容 */payload_s,                /* 负载内容长度 */handle,                    /* libnet句柄 */0                        /* 新建包 */);if (tcp_tag == -1) {printf("libnet_build_tcp failure\n");return (-3);};/* 构造IP协议块,返回值是新生成的IP协议快的一个标记 */ip_tag = libnet_build_ipv4(LIBNET_IPV4_H + LIBNET_TCP_H + payload_s, /* IP协议块的总长,*/0, /* tos */(u_short) libnet_get_prand(LIBNET_PRu16), /* id,随机产生0~65535 */0, /* frag 片偏移 */(u_int8_t)libnet_get_prand(LIBNET_PR8), /* ttl,随机产生0~255 */proto, /* 上层协议 */0, /* 校验和,此时为0,表示由Libnet自动计算 */src_ip, /* 源IP地址,网络序 */dst_ip, /* 目标IP地址,网络序 */NULL, /* 负载内容或为NULL */0, /* 负载内容的大小*/handle, /* Libnet句柄 */0 /* 协议块标记可修改或创建,0表示构造一个新的*/);if (ip_tag == -1) {printf("libnet_build_ipv4 failure\n");return (-4);};/* 构造一个以太网协议块,只能用于LIBNET_LINK */eth_tag = libnet_build_ethernet(dst_mac, /* 以太网目的地址 */src_mac, /* 以太网源地址 */ETHERTYPE_IP, /* 以太网上层协议类型,此时为IP类型 */NULL, /* 负载,这里为空 */ 0, /* 负载大小 */handle, /* Libnet句柄 */0 /* 协议块标记,0表示构造一个新的 */ );if (eth_tag == -1) {printf("libnet_build_ethernet failure\n");return (-5);};packet_size = libnet_write(handle); /* 发送已经构造的数据包*/libnet_destroy(handle); /* 释放句柄 */return (0);
}

三、发送icmp数据包

#include <libnet.h>
#define NUM 10 /* the num of ICMP packets*/
void send_packets(){int i;libnet_t *l = NULL;/* libnet句柄 */   libnet_ptag_t protocol_tag;/* 协议标记 */   char *payload_liu_wen_tao = "12435"; /* 负载 */   u_short payload_length = 1000; /* 负载长度 */   char *device = "ech0";/*网络设备接口*/   char *destination_ip_str = "192.168.111.129";/* 目的IP地址字符串 */   char *source_ip_str = "192.168.111.129"; /* 源IP地址字符串 */   u_long source_ip = 0; /* 源IP地址 */   u_long destination_ip = 0; /* 目的IP地址 */   char errbuf[LIBNET_ERRBUF_SIZE]; /* 错误信息 */   int packet_length; /* 发送的数据包的长度 */   l = libnet_init( /* 初始化libnet */LIBNET_RAW4, /* libnet类型,为原始套接字IPv4类型 */device,  /* 网络设备接口 */errbuf /* 错误信息 */   );   source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE);   /* 把源IP地址字符串形式转化为网络字节顺序的数据 */   destination_ip = libnet_name2addr4(l, destination_ip_str, LIBNET_RESOLVE);   /* 把目的IP地址字符串形式转化为网络字节顺序的数据 */   protocol_tag = libnet_build_icmpv4_echo( /* 构造ICMP回显数据包 */    ICMP_ECHO, /* 类型,此时为回显请求 */   0,/* 代码,应该为0 */   0, /* 校验和,为0,表示由libnet句柄自动计算 */   123,  /* 标识符,赋值为123,自己任意填写数值 */   456, /* 序列号,赋值为245,自己任意填写数值 */   NULL,  /* 负载,赋值为空 */   0, /* 负载的长度,赋值为0 */   l, /* libnet句柄,应该是由libnet_init()函数得到的 */   0  /* 协议块标记,赋值为0,表示构造一个新的协议块 */   );   protocol_tag = libnet_build_ipv4(/* 构造IP协议块 */   LIBNET_IPV4_H + LIBNET_ICMPV4_ECHO_H + payload_length,/* IP协议块的长度 */   0, /* 服务质量,这里赋值为0 */   10,  /* 标识符,这里赋值为10 */   0, /* 偏移,这里赋值为0 */   20,/* 生存时间,这里赋值为20 */   IPPROTO_ICMP,/* 上层协议类型,这里是ICMP协议 */   0, /* 校验和,这里为0表示由libnet计算校验和 */   source_ip, /* 源IP地址 */   destination_ip,/* 目的IP地址 */   payload_liu_wen_tao, /* 负载 */   payload_length, /* 负载的长度 */   l,/* libnet句柄 */   0 /* 协议块标记,为0表示构造一个新的IP协议块 */   );   while(1){packet_length = libnet_write(l); /* 发送由libnet句柄l表示的数据包 */   printf("the length of the ICMP packet is %d\n", packet_length);   /* 输出发送的数据包信息 */   }libnet_destroy(l); /* 销毁libnet */
}void main()
{   send_packets();
}   

转载于:https://www.cnblogs.com/myblog-lyc/p/4165045.html

(C)libnet-发送arp/tcp/icmp数据包相关推荐

  1. 以太网,IP,TCP,UDP数据包分析【转】

    原文地址:http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 ...

  2. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  3. ibm aix 抓包命令_在IBM AIX上模拟丢弃的TCP / IP数据包

    本文介绍: AIX内核扩展,允许来往于指定主机的指定百分比的TCP / IP数据包被随机丢弃,以模拟不利的网络状况. 加载,激活和卸载内核扩展的实用程序. C和Java™实用程序,用于监视到达目标主机 ...

  4. 用Golang自己构造ICMP数据包

    ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误. 限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的 ...

  5. python构造icmp数据包_如何在python中构造ICMP数据包

    为了学习,我目前正在尝试创建一个简单的python porgram来向某个设备发送ICMP ping数据包.为了开始,我查看了python模块Pyping:https://github.com/Akh ...

  6. 编写一个python程序,利用scapy数据库构造一个icmp数据包,使其能实现ip扫描

    下面是一个使用 scapy 库来构造 ICMP 数据包并进行 IP 扫描的 Python 程序的示例: from scapy.all import *# 设置源 IP 地址和目的 IP 地址 src_ ...

  7. 如何在Linux命令行下发送和接收UDP数据包

    众所周知,在传输层有两个常用的协议 TCP 和 UDP,本文介绍在 Linux 命令行下,如何使用 nc 命令发送或接收 UDP 数据包,这些命令的用法对调试 UDP 通信程序将有所帮助. 1. 问题 ...

  8. 网络技术入门 :HTTP报文和TCP/IP数据包

    本章把HTTP报文和TCP/IP数据包放在一起.是因为: 报文是一个完成的有意义的数据. 数据包可以理解为组成报文的传输单元. 应用程序的数据一般都比较大,因此TCP会按照网络包的大小对数据进行拆分. ...

  9. 网络安全—arp欺骗原理数据包分析

    网络安全-arp欺骗原理&数据包分析 提要:arp欺骗虽然比较简单,但是在日常面试中也是会被经常问到的问题,本文将通过kali中的arpspoof工具进行arp攻击,同时使用wireshark ...

最新文章

  1. Matlab中plot函数参数解析
  2. iOS组件化-带你一步步实现项目的组件化
  3. IOS15给UICollection添加测试数字
  4. linux 查看主机版本,Linux下如何查看版本信息的方法步骤
  5. Java 设计模式之 Observer 模式
  6. Android 系统(161)---N/O版本上图库打开一张图片,图片从模糊到清晰的时间太长
  7. CentOS7安装和配置ftp服务
  8. 菜鸟心态综合症4:缺乏自信,总对自己说No
  9. ecshop源码分析:会话类cls_session
  10. RNA 22. SCI 文章中基于表达估计恶性肿瘤组织的基质细胞和免疫细胞(ESTIMATE)
  11. 物理机是什么?跟云服务器有什么区别
  12. meltdown论文翻译
  13. [转载]中华桥梁先驱——茅以升
  14. 横向扩展与纵向扩展区别详解
  15. redis-port工具
  16. 2019,收获,静静等待
  17. 对Hive连接metastore数据库的密码进行加密处理
  18. 生产环境kubeadm部署k8s(1.23)高可用集群
  19. 【汇编小白】关于masm5.0 显示 Unable to open input file
  20. Golang对象池实现

热门文章

  1. 微软发布ASP.NET MVC 1.0正式版
  2. windows的libcurl下zlib1.dll问题
  3. VS2010编译器经常遇到的小问题
  4. C++提高部分_C++函数模板_案例_数组排序---C++语言工作笔记083
  5. AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120
  6. Ruoyi框架Maven编译不通过的问题---SpringCloud Alibaba_若依微服务框架改造---工作笔记006
  7. 微信小程序开发学习笔记006--微信小程序组件详解02
  8. java在线支付---04_编写易宝支付的客户端加密工具类
  9. android学习笔记---46视频刻录的实现,视频录像器。
  10. landmark is float