发送arp数据包

2023-10-30

 


代码来自busybox,函数询问TEST_IP的mac地址。read_interface函数通过ioctl来获取接口interface相关信息,arpping用于发送arp数据包。

也可以使用s = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
则地址则变成了struct sockaddr_ll addr; 在arpping中调用以下函数,则也可以发送

# include < unistd. h>
# include < errno . h>
# include < netdb. h>
# include < signal . h>
# include < sys/ socket . h>
# include < sys/ poll. h>
# include < sys/ ioctl. h>
# include < netinet/ if_ether. h>
# include < net/ if_arp. h>
# include < netinet/ udp. h>
# include < netinet/ ip. h>
# include < stdio. h>
# include < stdarg. h>
# include < net/ if . h>

enum {
    ARP_MSG_SIZE = 0x2a
} ;

char * strncpy_IFNAMSIZ( char * dst, const char * src)
{
# ifndef IFNAMSIZ
        enum { IFNAMSIZ = 16 } ;
# endif
            return strncpy ( dst, src, IFNAMSIZ) ;
}

struct arpMsg {
    /* Ethernet header */
    uint8_t h_dest[ 6] ; /* 00 destination ether addr */
    uint8_t h_source[ 6] ; /* 06 source ether addr */
    uint16_t h_proto; /* 0c packet type ID field */

    /* ARP packet */
    uint16_t htype; /* 0e hardware type (must be ARPHRD_ETHER) */
    uint16_t ptype; /* 10 protocol type (must be ETH_P_IP) */
    uint8_t hlen; /* 12 hardware address length (must be 6) */
    uint8_t plen; /* 13 protocol address length (must be 4) */
    uint16_t operation; /* 14 ARP opcode */
    uint8_t sHaddr[ 6] ; /* 16 sender's hardware address */
    uint8_t sInaddr[ 4] ; /* 1c sender's IP address */
    uint8_t tHaddr[ 6] ; /* 20 target's hardware address */
    uint8_t tInaddr[ 4] ; /* 26 target's IP address */
    uint8_t pad[ 18] ; /* 2a pad for min. ethernet payload (60 bytes) */
} PACKED;
const int const_int_1 = 1;
int setsockopt_broadcast( int fd)
{
    return setsockopt ( fd, SOL_SOCKET, SO_BROADCAST, & const_int_1, sizeof ( const_int_1) ) ;
}

char * safe_strncpy( char * dst, const char * src, size_t size)
{
    if ( ! size) return dst;
    dst[ - - size] = '/0' ;
    return strncpy ( dst, src, size) ;
}


int arpping( uint32_t test_ip, uint32_t from_ip, uint8_t * from_mac, const char * interface)
{
    int timeout_ms;
   
int s;
    int rv = 1; /* "no reply received" yet */
    struct sockaddr addr; /* for interface name */
    struct arpMsg arp;

    s = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ;
    if ( s = = - 1) {
        perror ( "raw_socket" ) ;
        return - 1;
    }

    if ( setsockopt_broadcast( s) = = - 1) {
        perror ( "cannot enable bcast on raw socket" ) ;
        goto ret;
    }

    /* send arp request */
    memset ( & arp, 0, sizeof ( arp) ) ;
    memset ( arp. h_dest, 0xff, 6) ; /* MAC DA */
    memcpy ( arp. h_source, from_mac, 6) ; /* MAC SA */
    arp. h_proto = htons ( ETH_P_ARP) ; /* protocol type (Ethernet) */
    arp. htype = htons ( ARPHRD_ETHER) ; /* hardware type */
    arp. ptype = htons ( ETH_P_IP) ; /* protocol type (ARP message) */
    arp. hlen = 6; /* hardware address length */
    arp. plen = 4; /* protocol address length */
    arp. operation = htons ( ARPOP_REQUEST) ; /* ARP op code */
    memcpy ( arp. sHaddr, from_mac, 6) ; /* source hardware address */
    memcpy ( arp. sInaddr, & from_ip, sizeof ( from_ip) ) ; /* source IP address */
    /* tHaddr is zero-fiiled */ /* target hardware address */
    memcpy ( arp. tInaddr, & test_ip, sizeof ( test_ip) ) ; /* target IP address */

    memset ( & addr, 0, sizeof ( addr) ) ;
    safe_strncpy( addr. sa_data, interface, sizeof ( addr. sa_data) ) ;
    if ( sendto ( s, & arp, sizeof ( arp) , 0, & addr, sizeof ( addr) ) < 0) {
        // TODO: error message? caller didn't expect us to fail,
        // just returning 1 "no reply received" misleads it.      
    }

ret:
    close ( s) ;
    return rv;
}

int read_interface( const char * interface, int * ifindex, uint32_t * addr, uint8_t * arp)
{
    int fd;
    struct ifreq ifr;
    struct sockaddr_in * our_ip;

    memset ( & ifr, 0, sizeof ( ifr) ) ;
    fd = socket ( AF_INET , SOCK_RAW , IPPROTO_RAW ) ;

    ifr. ifr_addr. sa_family = AF_INET ;
    strncpy_IFNAMSIZ( ifr. ifr_name, interface) ;
    if ( addr) {
        if ( ioctl( fd, SIOCGIFADDR , & ifr) ! = 0) {
            perror ( "ioctl" ) ;
            close ( fd) ;
            return - 1;
        }
        our_ip = ( struct sockaddr_in * ) & ifr. ifr_addr;
        * addr = our_ip- > sin_addr. s_addr;
        printf ( "ip of %s = %s /n" , interface, inet_ntoa( our_ip- > sin_addr) ) ;
    }

    if ( ifindex) {
        if ( ioctl( fd, SIOCGIFINDEX , & ifr) ! = 0) {
            close ( fd) ;
            return - 1;
        }
        printf ( "adapter index %d" , ifr. ifr_ifindex) ;
        * ifindex = ifr. ifr_ifindex;
    }

    if ( arp) {
        if ( ioctl( fd, SIOCGIFHWADDR , & ifr) ! = 0) {
            close ( fd) ;
            return - 1;
        }
        memcpy ( arp, ifr. ifr_hwaddr. sa_data, 6) ;
        printf ( "adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x/n" ,
            arp[ 0] , arp[ 1] , arp[ 2] , arp[ 3] , arp[ 4] , arp[ 5] ) ;
    }
    close ( fd) ;
    return 0;
}

int main( void )
{
    uint32_t TEST_IP = inet_addr( "191.192.193.194" ) ;
    char interface[ ] = "eth0" ;
    uint32_t ip;
    uint8_t mac[ 6] ;
    read_interface( interface, NULL , & ip, mac) ;  
    
    while ( 1) {
        arpping( TEST_IP, ip, mac, interface) ;
        sleep ( 1) ;
    }
    return 0;

}

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

发送arp数据包 的相关文章

  • Kotlin:如何让Android Studio在类底部实现接口的功能

    在 Kotlin 类中实现接口时 当我在 ClassName 上按 Alt Enter 时 我可以让 IDE 通过 实现成员 添加接口的功能 在 Kotlin 中 这些函数被添加到类的顶部 这有点烦人 我希望将它们添加到类的末尾 就像在 J
  • 将对象转换为没有 TInterfacedObject 作为基类的接口类型

    我需要一个没有引用计数的实现接口的类 我做了以下事情 IMyInterface interface IInterface B84904DF 9E8A 46E0 98E4 498BF03C2819 procedure InterfaceMet
  • 为什么 Haskell [] (list) 不是类型类?

    我正在编写一个 Haskell 函数 它接受一个列表作为输入 也就是说 它没有理由不能是队列或出列 或者任何允许我访问它的 头 和 尾 并检查它是否为空 的东西 所以 a 输入类型似乎太具体了 但据我所知 没有标准库类型类可以准确捕获此接口
  • 为一个参数指定多个接口

    我有一个实现两个接口的对象 接口是 public interface IObject string Name get string Class get IEnumerable
  • 是否有类似 ICollection 的接口,但专为排序集合而设计?

    或者我可以毫无问题地使用 ICollection 吗 我的意思是 我不认为 ICollection 是为排序集合设计的 因为这可能会破坏为排序或未插入 ICollection 对象设计的应用程序 但我不知道 我会说ICollection 接
  • 为什么我们要实现接口?

    实现接口只是提供方法的骨架 如果我们知道该方法的确切签名行 在这种情况下实现接口有什么要求 这是Interface已经实现的情况 interface IMy void X public class My IMy public void X
  • Java 中的泛型

    我想了解以下类型的语法 Example public interface A lt T extends A lt T gt gt 这个接口的逻辑是什么 这将按如下方式使用 class X implements A
  • JDK 8 中的默认值是 Java 中多重继承的一种形式吗?

    JDK 8 中的一项新功能允许您添加到现有接口 同时保留二进制兼容性 语法就像 public interface SomeInterface void existingInterface void newInterface default
  • Java 8 中接口和抽象类之间的根本区别[重复]

    这个问题在这里已经有答案了 考虑到接口现在可以为其提供的方法提供实现 我无法正确合理地解释接口和抽象类之间的差异 有谁知道如何正确解释其中的差异 我还被告知 从性能角度来看 接口比抽象类更轻量 有人可以证实这一点吗 接口仍然不能有任何状态
  • 如何在 Java 中以编程方式获取接口的所有实现的列表?

    我可以通过反思或类似的方式来做到这一点吗 我已经搜索了一段时间 似乎有不同的方法 这里总结一下 反思 https github com ronmamo reflections如果您不介意添加依赖项 该库非常受欢迎 它看起来像这样 Refle
  • typescript 扩展不需要的接口

    我有两个接口 interface ISuccessResponse Success boolean Message string and interface IAppVersion extends ISuccessResponse OSVe
  • 设计决策:为什么以及何时将接口设为私有?

    设计决策中是否使用过私有接口 如果是这样 原因是什么 您什么时候知道需要私有接口 A 顶层接口不能是私有的 它只能有public或包访问 来自Java 语言规范 第 9 1 1 节 接口修饰符 https docs oracle com j
  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo
  • 有没有办法找到哪些 .NET 类实现了某个接口?

    例如 如果我想查看我的 NET 选项用于实现 IList 或 IDictionary 有没有办法找到它 例如在 MSDN 文档中 我认为可以使用反射器 http www red gate com products reflector
  • 界面与组合

    我想我理解接口和抽象之间的区别 抽象设置默认行为 在纯抽象的情况下 行为需要由派生类设置 接口是您所需要的 无需基类的开销 那么接口相对于组合的优势是什么 我能想到的唯一优点是在基类中使用受保护的字段 我缺少什么 你的标题没有意义 你的解释
  • 删除接口中的冗余类型

    我有以下接口 public interface IRevision
  • 如何在UITextField上自动打开键盘?

    我有一个非常简单的表格 当触摸单元格时 它会打开一个带有一个 UITextfield 的新视图 我想要的只是键盘会自动打开 而用户无需触摸 UITextfield 这一切都是在 Interface Builder 中完成的 所以我不确定如何
  • 继承接口方法的重新实现

    我不完全理解如何使用接口 所以我必须问 我使用 BaseClass 它实现了 IBaseClass 接口 这些接口仅包含一个声明 public interface IBaseClass void Refresh 所以我在我的 Basecla
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 具有不同返回类型的 C# 通用接口

    我有可以返回多种格式数据的网络服务 例如 json 和 xml 我正在针对此 Web 服务构建一个简单的 C api 我希望这些方法能够从 json 原始 json 或原始 xml 返回完全序列化的对象 例如 List

随机推荐

  • 安卓pos机开发!写给互联网大厂员工的真心话,附带学习经验

    前言 19年6月份从网易云音乐离开 放弃了留学机会 开始了人生的第一次创业 前后尝试了两个项目 因为个人能力与时机因素都失败了 虽然没能享受到创业所能够带来高杠杆物质上的回报 但是对个人软技能和自我边界认知上都有了很大的提升 对于这段经历有
  • [Error] invalid operands of types 'float' and 'int' to binary 'operator%' c错误

    错误提示告诉你 的所有两边 一个是整形 int 一个是浮点型 float 类型不匹配报错 所以你把应该把 其中一个变量定义成整形
  • 前端(node.js)调用dll动态链接库

    壹 需求 使用 js node 调用dll 动态链接库 github地址如下 包含dll 里面就一个Add方法暴露出来 github 贰 两种方式调用dll 当前开发环境 Windows 11 22H2 node v16 20 0 Pyth
  • logback配置日志

    logback的详细介绍网上有很多 http blog csdn net jibaole article details 52442694 参考文档 使用方法 当我们分清了log4j logback和slf4j的关系后 我们就可以使用它们了
  • [701]labelImg标注工具

    labelImg github https github com tzutalin labelImg exe下载 https tzutalin github io labelImg 用于深度网络训练的数据集做标注的方法和工具有好多 像Lab
  • dockerfile基于apline将JDK20打包成镜像

    dockerfile基于apline将JDK20打包成镜像 今天就来和大家聊聊如何把最新出版的JDK20打包成docker镜像 很多uu都会采用centos作为基础镜像 这么做会有一个问题 centos系统会含有很多库文件 这些库文件JDK
  • Visual Studio Code和IntelliJ IDEA运行spring boot项目

    纯前端 没有java经验 要运行一个spring boot项目 根据别人博文运行成功 现整理到本文 以更基础的方式写步骤 参考博文 超详细的VsCode创建SpringBoot项目 图文并茂 yd的博客 CSDN博客 一 Java环境配置
  • Pytorch多GPU训练:DataParallel和DistributedDataParallel

    引言 Pytorch有两种方法实现多GPU训练 分别是DataParallel DP 和DistributedDataParallel DDP DP实现简单 但没有完全利用所有GPU资源 DDP实现相对复杂 但是更快 我建议使用DDP DP
  • bert入门之分词源码解析

    bert编码方法 概括起来 就分词和id映射 我们先看一下分词的两个方法 一 BasicTokenizer 大致流程 转成 unicode gt 去除各种奇怪字符 gt 处理中文 gt 空格分词 gt 去除多余字符和标点分词 gt 再次空格
  • 国内就能用的Chat-GPT分享

    人工智能在语音理解与交互的新里程碑 AI聊天平台 在人工智能 AI 领域 语言模型的发展日新月异 这其中 OpenAI所推出的GPT系列语言模型尤为显眼 尤其是其中的一员 ChatGPT 已经在人工智能的语言理解与交互方面设定了一个新的里程
  • PB安装步骤

    安装PowerBuilder 9 0具体步骤 1 解压压缩包 双击 SETUP 2 点击 Next 3 点击 Yes 4 点击 Next 5 选择好安装到的文件夹 点击 Next 6 选择组件 我只选择PowerBuilder 点击 Nex
  • 如何加载HTML页面页面到另一个界面中

    1 第一种 iframe 但是 对于个人经验来说 iframe最好不要用 不仅自适应不太好 而且对于seo优化特别不好 2 第二种 通过jQuery load 事件加载页面 比较简单 但是会刷新界面 不过个人感觉影响不大 可以return
  • 3、初识程序

    数据结构静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 高效的程序 恰当的数据结构 合适的算法 算法是特定问题求解步骤的描述 在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想 特性 输
  • 如何开始学习大数据

    最近很多人都想学习大数据开发 但是却不知道如何开始学习 传统的web应用 LAMP JavaEE NODE系等 与大数据什么关系 推荐一个大数据学习群 142973723每天晚上20 10都有一节 免费的 大数据直播课程 专注大数据分析方法
  • 荣耀社招笔试

    荣耀社招笔试题纪录篇 原文链接荣耀社招笔试题 十一放假回家参加了荣耀社招笔试 两道算法题 解析仅供参考 第一题 旋转矩阵 题目描述 给你一幅由 N N 矩阵表示的图像 其中每个像素的大小为 4 字节 请 你设计一种算法 将图像旋转 90 度
  • Linux查看已安装软件版本

    在Linux中 可以使用以下命令来查看软件版本 1 使用命令 软件名 version 来查看软件版本 例如 gcc version 2 使用命令 软件名 v 来查看软件版本 例如 python v 3 使用命令 rpm q 软件名 来查看已
  • idea windows找不到文件chrome

    一 原因分析 浏览器安装的地址有变动 二 解决 1 打开IDEA的设置页面 2 选中setting 找到tools目录下的Web Browsers 3 在电脑桌面上找到谷歌的图标 显示位置不一样 所以根据自身电脑找到谷歌图标 右键单击 gt
  • Generative Modeling by Estimating Gradients of the Data Distribution阅读笔记

    目录 概述 传统score based generative modeling介绍 score matching Langevin dynamics 传统score based generative modeling存在的问题 流形假设上的
  • Python的re.rearch()和group()详解, 及它们的综合使用

    re search 字符串1 字符串2 flags 0 以列表形式 返回在字符串2中所有匹配到的第一个字符串1 如果无 则返回空列表 其中flag参数一般很少使用 补充 re seaech re findall re match 等方法都有
  • 发送arp数据包

    代码来自busybox 函数询问TEST IP的mac地址 read interface函数通过ioctl来获取接口interface相关信息 arpping用于发送arp数据包 也可以使用s socket PF PACKET SOCK R