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为网关的MAC
        0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //ubuntu源MAC
        0x08, 0x00,                         // ICMP协议是属于IP包
    //===IP层或者说 网络层
        0x45,//4代表IPV4   5代表IP头(5*4=20个字节)
        0x00,//服务类型,可以反映当前主机一些状态信息,可以直接填0
        0,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的IP
        47,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.10

192.168.59

192.168.18.10
192.168.18+100.10






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] == 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请求包发出网卡的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
        0xc0, 0xa8, 0x01, 0x0b,             //发送方IP 192.168.1.11
        0x00, 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  1

unsigned char ArpBuf[] =
    {
        0xFF, 0XFF, 0XFF, 0XFF, 0xFF, 0XFF, //目标MAC
        0x00, 0x0c, 0x29, 0x5b, 0xe5, 0x7c, //源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
        0xc0, 0xa8, 0x01, 0x0b,             //发送方IP 192.168.1.11
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //目标MAC
                                            // 0xc0,0xa8,0x01,0x09  //目标IP
        192, 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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文案转化率低?快看看这两个坑你踩没踩

对于很多中小企业来说&#xff0c;无论是来拓市场还是获客&#xff0c;软文营销都会成为他们的主要营销方式&#xff0c;比较软文营销的成本较低&#xff0c;同时门槛也不高。但是也有品牌发现&#xff0c;自己和团队辛苦构思了几周写出的文案&#xff0c;但是效果不是很好。今…

五、Elasticsearch 集成

目录 5.1 Spring Data 框架集成5.1.1 Spring Data 框架介绍5.1.2 Spring Data Elasticsearch 介绍5.1.3 Spring Data Elasticsearch 版本对比5.1.4 集成步骤 5.1 Spring Data 框架集成 5.1.1 Spring Data 框架介绍 Spring Data 是一个用于简化数据库开发的开源框架。其主要目…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

【机器学习之旅】概念启程、步骤前行、分类掌握与实践落地

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

六、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(2)

Rule #5 - If your work changes, your system should too. 准则五&#xff1a;如果你的工作变了&#xff0c;你的系统也应该改变。 For some, work will be consistent enough to not need major changes.You simply stick to the same system and you’ll get the results y…

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126

高精密基准源 国产替代 REF191 ADR4520 ADR420 ADR430 ADR440 REF5020 MAX6126 ADR03 REF03 REF192 AD580 AD780 ADR441 ADR4525 ADR431 ADR421 REF5025ADR423 ADR433 ADR443 ADR4530 REF193 AD780 ADR06 REF5030ADR434 ADR444 ADR4540 REF198 REF5040ADR425 ADR435 ADR445 AD…

成功推出全新生成式AI的四大原则

生成式AI有望从根本上打开一扇新世界机遇的大门&#xff0c;以满足各行各业的客户需求。从提供个性化回复的对话式聊天机器人&#xff0c;到各种应用的代码&#xff0c;再到营销传播的目标内容&#xff0c;生成式AI正在彻底改变企业的运作方式。为竞相提供卓越的客户体验&#…

分布式系统的发展史

目录 &#x1f433;今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 &#x1f407;一、常见概念 &#x1f407;二、发展史 今日良言&#xff1a;且视他人之疑目如盏盏鬼火&#xff0c;大胆地去走自己的夜路 一、常见概念 在正式介绍分布式系…

16、OpenFeign和Sentinel集成实现fallback服务降级

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-consumer-nacos-order83 通过OpenFeign调用 cloudalibaba-provider-payment9001 1、 83 通过OpenFeign调用 9001微服务&#xff0c;正常访问OK 2、 83 通过OpenFeign调用 …

推特社交机器人分类

机器人有不同的种类。 cresci-17数据集中的三种不同的机器人类:传统垃圾机器人、社交垃圾机器人和假追随者。 传统的垃圾邮件机器人会生成大量推广产品的内容&#xff0c;并且可以通过频繁使用的形容词来检测; 社交垃圾邮件倾向于攻击或支持政治候选人&#xff0c;因此情绪是一…

centos配置natapp 自动配置

步骤 下载客户端 赋值权限 启动测试是否可用配置natapp.service 设置自动启动 natapp.service 配置的文件夹需要跟 natapp的路径一致 下载配置文件 centos 这里 我用的 natapp_autostart-master\natapp_autostart-master\systemd 文件夹下的 natapp.service 上传natapp到服…

深入解析大语言模型显存占用:训练与推理

深入解析大语言模型显存占用&#xff1a;训练与推理 文章脉络 估算模型保存大小 估算模型在训练时占用显存的大小 全量参数训练 PEFT训练 估算模型在推理时占用显存的大小 总结 对于NLP领域的从业者和研究人员来说&#xff0c;有没有遇到过这样一个场景&#xff0c;你的…

小白一次过软考高级(信息系统项目管理师)秘籍,请收藏!!!

作为一位软考老司机&#xff0c;我觉得我还是有资格说一说的。 我的考试成绩&#xff1a; 高级软考考试基础信息&#xff1a; 考试科目&#xff1a;总共分为3科&#xff0c;综合知识、案例分析、论文 成绩&#xff1a;满分75分&#xff0c;45分及格&#xff0c;需同时通过3科…

抽象类和接口(1)(抽象类部分)

❤️❤️前言 hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1f4a5;&#xff0c;如果发现这篇文章有问题的话&…

初步接触C++

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习C&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 初步区别C语言和C命名空间1.命名空间的定义2.命名空间的使用 C的输入输出缺省参数1.缺省参数…

Python Flask-Mail实现邮件发送

一、邮件发送的扩展 关于如何找到flask发送邮件的插件&#xff1f;&#xff0c;上一篇已经分享了如何找到第三方插件&#xff0c;也找到了插件flask-mail的使用文档&#xff0c;那我们就来实战吧 二、根据文档&#xff0c;总结发送邮件的流程 从文档中可以总结出发送邮件的步…

【进程控制】谈谈进程终止的三种状态

文章目录 进程终止退出码信号信号术语 进程常见的退出方法exit函数与_exit函数的区别对比exit和_exit函数对于缓冲区的处理 进程终止 进程终止&#xff0c;也就是进程运行结束。结束有两种含义&#xff0c;一种是“正常”结束&#xff0c;带有结果&#xff0c;即代码运行完毕。…

第十三届蓝桥杯省赛C++ A组 Java A组/研究生组《推导部分和》(C++)

【题目描述】 【输入格式】 【输出格式】 【数据范围】 【输入样例】 5 3 3 1 5 15 4 5 9 2 3 5 1 5 1 3 1 2 【输出样例】 15 6 UNKNOWN 【思路】 题解来源&#xff1a;AcWing 4651. $\Huge\color{gold}{推导部分和}$ - AcWing 【代码】 #include<bits/stdc.h> #define…

使用itext-core生成PDF

1、添加引用依赖包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency> 2、上代码 package com.student.demo.pdf;impor…

C# 登录界面代码

背景 MVVM 是一种软件架构模式&#xff0c;用于创建用户界面。它将用户界面&#xff08;View&#xff09;、业务逻辑&#xff08;ViewModel&#xff09;和数据模型&#xff08;Model&#xff09;分离开来&#xff0c;以提高代码的可维护性和可测试性。 MainWindow 类是 View&a…