09 网络ARP请求,响应,ICMP协议

arp协议_arp请求_arp回应

ICMP包构造ping搜狐服务器参考

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <pthread.h>unsigned short in_cksum(unsigned short *addr, int len)
{unsigned int sum = 0, nleft = len;unsigned short answer = 0;unsigned short *w = addr;while (nleft > 1) {sum += *w++;nleft -= 2;}if (nleft == 1) {*(u_char *) (&answer) = *(u_char *) w;sum += answer;}sum = (sum >> 16) + (sum & 0xffff);//将高16bit与低16bit相加sum += (sum >> 16);//将进位到高位的16bit与低16bit 再相加answer = (unsigned short)(~sum);return (answer);
}unsigned char ICMPBuf[]=
{//===链路层0x48, 0x5a, 0xea, 0x98, 0x27, 0x3c, //目标MAC为网关的MAC0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //ubuntu源MAC0x08, 0x00,                         // ICMP协议是属于IP包//===IP层或者说 网络层0x45,//4代表IPV4   5代表IP头(5*4=20个字节)0x00,//服务类型,可以反映当前主机一些状态信息,可以直接填00,0,//IP包的长度,也不是整个包字节-链路层14个字节?0x00,0x00,0x40,0x00,//数据包标示编号设置为0,数据包不支持分片功能64,//默认TTL time to live 64最多可以过64个路由器1,//ICMP协议0,0,//IP包头的20个字节校验和192,168,1,11,//源IP,发送方ubuntu的IP47,91,20,194,//目标IP,搜狐服务器IP//ICMP请求内容0x08,0x00,//为ICMP请求包,如果是0x00,0x00,是回应0x00,0x00,//ICMP报文校验0,0,//通常填大端的getpid(),也可以填默认0 0x00,0x2b,//发送的包编号 43,可以随意填,回应包编号和发送包一样// 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 时间戳 8个字节可加也可不加'1','2','3','4','5',//数据内容可以任意'h','e','l','l','o'        };192.168.18.10192.168.59192.168.18.10
192.168.18+100.10void *myfun(void *arg)
{int sockfd = (int)arg;unsigned char recvbuf[100] = {0};while (1){int recvlen = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, NULL, NULL);if ((recvbuf[12] == 0x08) && (recvbuf[13] == 0x00)){//IP包if (recvbuf[23] == 0x01){//ICMP协议if((recvbuf[34] == 0x00)&&(recvbuf[35] == 0x00)){//回应printf("hjs收到搜狐网服务器ICMP回应包:TTL=%d,经过%d个路由器\n",recvbuf[22],64-recvbuf[22]);}}}}retursn NULL;
}
int main()
{unsigned char data[]={0x45,0x00,0x00,0x54,0x00,0x00,0x40,0x00,0x40,0x01,\0,0,0xc0,0xa8,0x01,0x0b,0x2f,0x5b,0x14,0xc2};printf("%#x\n",htons(in_cksum(data,20)));//设置包编识unsigned short mypid=getpid();// *(unsigned short *)(ICMPBuf+38)=htons(mypid);//填入IP包长度*(unsigned short *)(ICMPBuf+16)=htons(sizeof(ICMPBuf)-14);//IP包头校验*(unsigned short *)(ICMPBuf+24)=in_cksum(ICMPBuf+14,20);//htons(in_cksum(ICMPBuf+14,20));//ICMP部分校验unsigned short icmplen=sizeof(ICMPBuf)-34;*(unsigned short *)(ICMPBuf+36)=in_cksum(ICMPBuf+34,sizeof(ICMPBuf)-34);//htons(in_cksum(ICMPBuf+34,sizeof(ICMPBuf)-34));int myfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));struct sockaddr_ll mysocket;struct ifreq ethreq;strcpy(ethreq.ifr_ifrn.ifrn_name, "eth0");ioctl(myfd, SIOCGIFINDEX, &ethreq);memset(&mysocket, 0, sizeof(mysocket));mysocket.sll_ifindex = ethreq.ifr_ifru.ifru_ivalue; //网卡信息的首地址pthread_t thread;pthread_create(&thread, NULL, myfun,(void *)myfd);pthread_detach(thread);printf("myfd=%d\n", myfd);int var = sendto(myfd, ICMPBuf, sizeof(ICMPBuf), 0, (struct sockaddr *)&mysocket, sizeof(mysocket));sleep(2);close(myfd);
}

icmp协议_请求和回应 (1)

扫描局域网主机MAC和IP参考

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <pthread.h>unsigned char ArpBuf[] ={0xFF, 0XFF, 0XFF, 0XFF, 0xFF, 0XFF, //目标MAC,广播0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //源MAC,当前主机ARP请求包发出网卡的MAC0x08, 0x06,                         // ARP包0x00, 0x01,                         //以太网类型0x08, 0x00,                         // IPv40x06,                               //硬件地址MAC 为6个字节0x04,                               //网络地址 IP 为4个字节0x00, 0x01,                         // arp 请求0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //发送方MAC0xc0, 0xa8, 0x01, 0x0b,             //发送方IP 192.168.1.110x00, 0x00, 0x00, 0x00, 0x00, 0x00, //目标MAC                               192, 168, 1, 0};//最后一个字节待定void *myfun(void *arg)
{int sockfd = (int)arg;unsigned char recvbuf[100] = {0};while (1){int recvlen = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, NULL, NULL);if ((recvbuf[12] == 0x08) && (recvbuf[13] == 0x06)){//ARP 包if ((recvbuf[20] == 0x00) && (recvbuf[21] == 0x02)){//ARP 回应printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x===>",recvbuf[22], recvbuf[23], recvbuf[24], recvbuf[25], recvbuf[26], recvbuf[27]);printf("IP: %d.%d.%d.%d\n",\recvbuf[28], recvbuf[29], recvbuf[30], recvbuf[31]);}}// printf("recvlen=%d\n", recvlen);}retursn NULL;
}
int main()
{int myfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));//创建一个原始套接字struct sockaddr_ll mysocket;struct ifreq ethreq;strcpy(ethreq.ifr_ifrn.ifrn_name, "eth0");//设置属性,等下sendto就从 eth0网卡发送出去数据包ioctl(myfd, SIOCGIFINDEX, &ethreq);memset(&mysocket, 0, sizeof(mysocket));mysocket.sll_ifindex = ethreq.ifr_ifru.ifru_ivalue; //网卡信息的首地址pthread_t thread;pthread_create(&thread, NULL, myfun,(void *)myfd);pthread_detach(thread);printf("myfd=%d\n", myfd);int cnt=1;while(cnt < 255){ArpBuf[41]=cnt;   int var = sendto(myfd, ArpBuf, sizeof(ArpBuf), 0, (struct sockaddr *)&mysocket, sizeof(mysocket));cnt++;}sleep(2);close(myfd);
}

原始套接字构造ARP请求包获取网关的MAC

//使用原始套接字,拿到当前局域网内,所有主机的IP和MAC
// #include <stdio.h>
// #include <sys/types.h> /* See NOTES */
// #include <sys/socket.h>// #include <linux/if_ether.h> //ETH_P_ALL
// #include <net/if.h>
// #include <sys/ioctl.h>// #include <linux/if_packet.h> //struct sockaddr_ll
// #include<string.h>
// #include<stdlib.h>
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <string.h>
#include <net/if.h>
#include <sys/ioctl.h>// unsigned char ArpBuf[] = {
//     0xFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, //目标MAC,ARP广播地址
//     0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c,       //源MAC,虚拟机ubuntu的MAC
//     0x08, 0x06,                               //是ARP包
//     0x00, 0x01,                               //是以太网类型帧
//     0x08, 0x00,                               //是IPV4协议
//     0x06,                                     //硬件地址MAC是6个字节
//     0x04,                                     //网络地址IP是4个字节
//     0x00, 0x01,                               //这是一个ARP请求包
//     0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c,       //源MAC
//     192, 168, 1, 11,                          //源IP
//     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//     192, 168, 1, 1 //目标的IP
// };                 //其实一个ARP包是48个字节
// // 17  9   7  8  1unsigned char ArpBuf[] ={0xFF, 0XFF, 0XFF, 0XFF, 0xFF, 0XFF, //目标MAC0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //源MAC0x08, 0x06,                         // ARP包0x00, 0x01,                         //以太网类型0x08, 0x00,                         // IPv40x06,                               //硬件地址MAC 为6个字节0x04,                               //网络地址 IP 为4个字节0x00, 0x01,                         // arp 请求0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //发送方MAC0xc0, 0xa8, 0x01, 0x0b,             //发送方IP 192.168.1.110x00, 0x00, 0x00, 0x00, 0x00, 0x00, //目标MAC// 0xc0,0xa8,0x01,0x09  //目标IP192, 168, 1, 1};int main()
{// 192.168.1.0 组网,主机IP 192.168.1.1~192.168.1.254//手动构造192.168.1.1~192.168.1.254  的ARP请求包,在子网发送,拿到所有的// ARP回应包。回应包 IP和MAC提取出来打印出来。//经过扫描就可以拿到当前局域里所有的主机IP和MAC//创建原始套接字,补充协议需要主机字节序转网络字节序// int myfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));// //指定从哪一个网卡发送出去?// //要获取一个个网卡 eth0// struct ifreq myeth;// memset(&myeth,0,sizeof(myeth));// strcpy(myeth.ifr_ifrn.ifrn_name, "eth0"); //填入网卡名字// ioctl(myfd, SIOCGIFINDEX, &myeth);        //获取网卡名为 eth0的信息,并填入到myeth// struct sockaddr_ll sll;// bzero(&sll,sizeof(sll));// sll.sll_ifindex = myeth.ifr_ifru.ifru_ivalue; //网卡信息的首地址// int ret = sendto(myfd, ArpBuf, sizeof(ArpBuf), 0, (struct sockaddr *)&sll, sizeof(struct sockaddr)); //把ARP封包发送出去int myfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));struct sockaddr_ll mysocket;struct ifreq ethreq;// IFNAMSIZ// # define ifr_name	ifr_ifrn.ifrn_name// strcpy(ethreq.ifr_name,"eth0");仅仅是一个宏定义strcpy(ethreq.ifr_ifrn.ifrn_name, "eth0");ioctl(myfd, SIOCGIFINDEX, &ethreq);memset(&mysocket, 0, sizeof(mysocket));mysocket.sll_ifindex = ethreq.ifr_ifru.ifru_ivalue; //网卡信息的首地址int var = sendto(myfd, ArpBuf, sizeof(ArpBuf), 0, (struct sockaddr *)&mysocket, sizeof(mysocket));printf("myfd=%d,ret=%d\n", myfd, var);unsigned char recvbuf[100] = {0};int recvlen = recvfrom(myfd, recvbuf, sizeof(recvbuf), 0, NULL, NULL);printf("recvlen=%d\n", recvlen);int i = 0;recvlen = 42;while (i < recvlen){if ((i % 10 == 0) && (i != 0)){ //一行如果有10个字节,就换行打印printf("\n");}printf("%x ", recvbuf[i]);i++;}if ((recvbuf[12] == 0x08) && (recvbuf[13] == 0x06)){printf("这是ARP包!!\n");if ((recvbuf[20] == 0x00) && (recvbuf[21] == 0x02)){printf("这是回应包!!\n");printf("网关的MAC:  %02x:%02x:%02x:%02x:%02x:%02x\n",\recvbuf[6], recvbuf[7], recvbuf[8], recvbuf[9], recvbuf[10], recvbuf[11]);}}close(myfd);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot Vue医院管理系统+数据库脚本+文档(万字)

项目效果视频: 基于Springboot Vue医院管理系统 一、 项目介绍 角色&#xff1a;管理员、患者、医生 基于springboot vue实现的医院管理系统&#xff0c;有管理员、医生和患者三种角色。系统拥有丰富的功能&#xff0c;能够满足各类用户的需求&#xff0c;系统提供了登录和注册…

Leetcode_27移除元素_26删除有序数组中的重复项_80删除有序数组中的重复项 II_169多数元素

文章目录 一、移除元素1.1 题目描述1.2 思路 二、删除有序数组中的重复项三、删除有序数组中的重复项 II四、多数元素 一、移除元素 1.1 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 …

PVE如何在CT中挂载目录

pct set 100 -mp1 /pveDir,mp/ctDir "pct set" pve命令 "100" ct编号 "-mp1" 挂载点1&#xff08;-mp2挂载点2&#xff09; "/pveDir" pve上的路径 "/ctDir" ct上的路径 若出现无权限写数据&#xff0c;参考下面的博客&…

2024年华为OD机试真题-文件缓存系统-Java-OD统一考试(C卷)

题目描述: 请设计一个文件缓存系统,该文件缓存系统可以指定缓存的最大值(单位为字节)。 文件缓存系统有两种操作:存储文件(put)和读取文件(get) 操作命令为put fileName fileSize或者get fileName 存储文件是把文件放入文件缓存系统中;读取文件是从文件缓存系统中访问已存…

ARM IHI0069F GIC architecture specification (1)

CH1.1 关于通用中断控制器 (GIC) GICv3 架构设计用于与 Armv8-A 和 Armv8-R 兼容的处理元件、PE 一起运行。 通用中断控制器 (GIC) 架构定义&#xff1a; • 处理连接到GIC 的任何PE 的所有中断源的架构要求。 • 适用于单处理器或多处理器系统的通用中断控制器编程接口。 GIC …

Day20 代码随想录(1刷) 二叉树

目录 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树 654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数…

最长公共子序列、LCS算法模型

LCS问题就是给定两个序列A和B&#xff0c;求他们最长的公共子序列。 在求解时&#xff0c;我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中&#xff08;不规定结尾&#xff09;的最长子序列的长度。 if(a[i]b[i]) dp[i][j]dp[i-1][j-1]1; else dp[i][j]max(dp[i-1][j],dp…

局部静态变量实现单例模式,线程安全(推荐使用)c++11

class Singleton{ public:~Singleton();static Singleton& getInstance(){static Singleton instance;return instance; } private:Singleton(); };原因是C 11标准中新增了一个特性叫Magic Static&#xff1a;如果变量在初始化时&#xff0c;并发线程同时进入到static声明语…

白话模电:4.耦合、差分、无源滤波、反馈(考研面试常问问题)

一、介绍一下三极管多级放大电路的三种耦合方式及其特点&#xff1f;耦合的目的是什么&#xff1f; 多级放大电路中各放大级之间的连接方式称为耦合方式。常见的耦合方式有三种&#xff1a;阻容耦合&#xff08;RC耦合&#xff09;、直接耦合和变压器耦合。 耦合的目的是将信号…

Dubbo的服务降级

Dubbo的服务降级是一种容错机制&#xff0c;用于在分布式系统中处理在异常或故障情况下保障系统的可用性和稳定性。服务降级的核心思想是当调用远程服务失败或超时时&#xff0c;不会让整个业务流程崩溃&#xff0c;而是通过提供备用方案来保持部分功能的正常运行。 在Dubbo中&…

华南地区日用品电商综合服务商「广州麦和」积极推进数字化,企企通助力企业SRM系统上线

近期&#xff0c;由企企通携手华南地区线上最大的居家清洁&个人护理行业的电子商务综合服务商之一麦和&#xff08;广州&#xff09;实业有限公司&#xff08;以下简称“广州麦和”&#xff09;打造的SRM采购供应链协同系统上线&#xff0c;推进数字化采购管理体系建设&…

Xilinx缓存使用说明和测试

Xilinx缓存使用说明和测试 1 BRAM说明2 FIFO说明3 实例测试3.1 代码3.2 仿真本文主要介绍Xilinx FPGA芯片中BRAM和FIFO的使用方法和测试结果,主要针对流接口进行仿真。 1 BRAM说明 BRAM是Xilinx芯片中重要的存储资源,其可配置为单端口RAM/ROM或者双端口RAM/ROM,本文以最复杂…

el-select 下拉框点击某一禁选选项 按Esc关闭弹窗 下拉框无法收起问题

下面请看详细内容 会出现下图情况 弹窗能正常关闭 但是下拉框选项面板仍然存在 解决思路1&#xff1a; 本来想的是监听dialog的Esc关闭事件 关闭时修改el-select-dropdown的css样式 将display none 这个没实现 解决思路2&#xff1a; 看官网发现有个失焦事件 他手动触发失…

大词汇量高质量3D物体生成需要解决哪些问题?如何解决?

作者:Vallee | 来源:计算机视觉工坊 在公众号「计算机视觉工坊」后台,回复「原论文」可获取论文pdf和代码链接 DiffTF: 基于Transformer的大词汇量3D扩散模型 大词汇量3D物体生成 最近基于扩散模型的3D生成方法大火,但如何生成大量类别且高质量的3D模型还没得到很好地解决…

SpringBoot+Vue项目跨域问题

一、前言 问题 当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时&#xff0c;那说明跨域了。 跨域 跨域是因为浏览器的同源策略所导致&#xff0c;同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能…

手写DNS服务器测速程序(工具分享)

手写DNS服务器测速程序&#xff08;工具分享&#xff09; 目的特性下载地址使用方法Golang代码 目的 为路由器设置dns时往往不知道如何设置dns为最佳&#xff0c;网上搜的脚本都不好用&#xff0c;于是手写了这个程序。 特性 多DNS服务器并发测试每个DNS服务器测试多次测试取…

python中的__dict__

类的__dict__返回的是&#xff1a;类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里的&#xff0c; 而实例化对象的&#xff1a;__dict__中存储了一些类中__init__的一些属性值。 import的py文件 __dict__返回的是&#xff1a;__init__的…

DARTS-: ROBUSTLY STEPPING OUT OF PERFORMANCE COLLAPSE WITHOUT INDICATORS

DARTS-&#xff1a;增加辅助跳跃连接&#xff0c;鲁棒走出搜索性能崩溃 论文链接&#xff1a;https://arxiv.org/abs/2009.01027 项目链接&#xff1a;GitHub - Meituan-AutoML/DARTS-: Code for “DARTS-: Robustly Stepping out of Performance Collapse Without Indicators…

数据平台“国产替代”掣肘在迁移?奇点云的工业制造实践解读

系列导读 如《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》指出&#xff0c;工业制造是“数据要素”的关键领域之一。如何发挥海量数据资源、丰富应用场景等多重优势&#xff0c;以数据流引领技术流、资金流、人才流、物资流&#xff0c;对于制造企业而言是…

Qt5.14.2 全面解锁Qt5事件处理的精髓

上一篇博文中&#xff0c;我们从高空中俯瞰了Qt5事件编织的壮阔进程。无论是最普通的鼠标点击&#xff0c;还是最先进的多点触控手势&#xff0c;抑或是跨越线程的事件传递&#xff0c;Qt5都为开发者们提供了一整套完备的事件处理方案和强大工具链&#xff0c;只等着你来施展渔…