当前位置: 首页 > news >正文

Linux- 自定义一个ARP请求

自定义一个ARP请求或响应,并使用AF_PACKET套接字发送,需要手动创建整个以太网帧。

下面是一个简单的C代码示例,用于发送一个ARP请求,查询给定IP地址的MAC地址:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <linux/if_packet.h>
#include <unistd.h>#define TARGET_IP "192.168.1.1"
#define INTERFACE_NAME "eth0"int main() {int sockfd;struct sockaddr_ll sll;struct ifreq ifr;unsigned char packet[ETH_FRAME_LEN];// Open socketsockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));if (sockfd == -1) {perror("socket");exit(EXIT_FAILURE);}// Get interface indexstrncpy(ifr.ifr_name, INTERFACE_NAME, IFNAMSIZ);if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {perror("ioctl");close(sockfd);exit(EXIT_FAILURE);}// Set index and protocolsll.sll_ifindex = ifr.ifr_ifindex;sll.sll_protocol = htons(ETH_P_ARP);// ARP framestruct ether_header *eh = (struct ether_header *) packet;struct ether_arp *arp = (struct ether_arp *)(packet + sizeof(struct ether_header));// Ethernet headermemset(eh->ether_dhost, 0xff, ETH_ALEN);  // Destination MAC is broadcastmemset(eh->ether_shost, 0xaa, ETH_ALEN);  // Set source MAC to whatever you wanteh->ether_type = htons(ETHERTYPE_ARP);// ARP packetarp->arp_hrd = htons(ARPHRD_ETHER);arp->arp_pro = htons(ETH_P_IP);arp->arp_hln = ETH_ALEN;arp->arp_pln = sizeof(in_addr_t);arp->arp_op = htons(ARPOP_REQUEST);// Source MAC and IPmemset(arp->arp_sha, 0xaa, ETH_ALEN);     // Set source MAC to whatever you wantarp->arp_spa[0] = 192; arp->arp_spa[1] = 168; arp->arp_spa[2] = 1; arp->arp_spa[3] = 10; // Source IP// Destination MAC and IPmemset(arp->arp_tha, 0x00, ETH_ALEN);     // Destination MAC is unknowninet_pton(AF_INET, TARGET_IP, arp->arp_tpa);// Sendif (sendto(sockfd, packet, sizeof(struct ether_header) + sizeof(struct ether_arp), 0, (struct sockaddr*)&sll, sizeof(sll)) == -1) {perror("sendto");close(sockfd);exit(EXIT_FAILURE);}close(sockfd);return 0;
}

注意:运行此代码需要root权限,因为使用AF_PACKET需要对网络接口有完全的访问权限。而且,确保修改代码中的TARGET_IP和INTERFACE_NAME为我们想要查询的目标IP和我们使用的网络接口名。

这只是一个简单示例,可以根据需要进行修改和扩展。


Q1: 如何设置mac地址为 00:15:5d:31:81:8c?

A1: 为了设置MAC地址为00:15:5d:31:81:8c,不能使用memset,因为memset会将同一个值设置到所有的字节中。对于MAC地址,每个字节可能有不同的值。

所以,我们需要明确地为每个字节设置对应的值。

unsigned char mac[6] = {0x00, 0x15, 0x5d, 0x31, 0x81, 0x8c};
memcpy(eh->ether_shost, mac, ETH_ALEN);

这里我们使用memcpy来复制预定义的MAC地址到eh->ether_shost

Q2: 使用memcpy来复制预定义的MAC地址到eh->ether_shost时需要考虑网络字节序吗?

A2: 不需要。MAC地址不受字节序的影响。

当我们谈论网络字节序时,我们通常指的是4字节的IPv4地址或2字节的端口号等整数值,它们在不同的架构上可能有不同的存储方式(大端序或小端序)。

但MAC地址只是一个6字节的序列,不被视为一个整数值。因此,当复制或传输MAC地址时,不需要进行字节序转换。只需确保按正确的顺序使用地址的各个部分。

为了更清晰地解释这一点,我们需要先理解为什么需要考虑字节序的问题,以及在何种情况下不需要考虑。

字节序

字节序是指在多字节数据中,较高有效位和较低有效位的存放顺序。主要有两种字节序:

  1. 大端序 (Big-Endian):较高的有效位被保存在地址较小的存储器地址中,而较低的有效位被保存在地址较大的存储器地址中。
  2. 小端序 (Little-Endian):较低的有效位被保存在地址较小的存储器地址中,而较高的有效位则被保存在地址较大的存储器地址中。

这对于如整数、端口号、IP地址等数据结构很重要,因为它们可能由多个字节组成,并且在不同的机器或平台上可能有不同的存储顺序。

MAC地址

现在,考虑MAC地址,它是一个由6字节组成的序列,通常表示为XX:XX:XX:XX:XX:XX的形式。例如,00:1A:2B:3C:4D:5E

这6个字节从左到右是MAC地址的序列,而不是一个单一的大数字。因此,当我们复制或传输MAC地址时,只需要确保这6个字节按照相同的顺序被复制或传输。不需要像处理整数或IP地址那样担心整个结构的字节序。

为了进一步简化:将MAC地址想象为一个6个字节的数组。当我们复制这个数组时,只是按照数组的顺序一个接一个地复制每个字节,而不需要考虑字节之间的相对顺序,因为数组的顺序已经定义了这些字节的相对位置。

相关文章:

Linux- 自定义一个ARP请求

自定义一个ARP请求或响应&#xff0c;并使用AF_PACKET套接字发送&#xff0c;需要手动创建整个以太网帧。 下面是一个简单的C代码示例&#xff0c;用于发送一个ARP请求&#xff0c;查询给定IP地址的MAC地址&#xff1a; #include <stdio.h> #include <stdlib.h> …...

C++下载器程序:如何使用cpprestsdk库下载www.ebay.com图片

本文介绍了如何使用C语言和cpprestsdk库编写一个下载器程序&#xff0c;该程序可以从www.ebay.com网站上下载图片&#xff0c;并保存到本地文件夹中。为了避免被网站屏蔽&#xff0c;我们使用了亿牛云爬虫代理服务提供的代理IP地址&#xff0c;以及多线程技术提高下载效率。 首…...

java springboot通过EnableConfigurationProperties全局声明bean并处理装配

Spring Boot中 我们想条件装配一个类 首先 我们要声明他的bean 而 EnableConfigurationProperties 可以直接将 要全局声明的类绑定在 属性类中 例如 我们随便创建一个类 就叫 textData 吧 参考代码如下 package com.example.webdom.domain;import org.springframework.boot.co…...

网络工程师知识点2

21、VLAN 有什么作用&#xff1f; ①广播控制&#xff1b;②安全性&#xff1b;③增加带宽利用率&#xff1b;④减少延迟。 22、实际的项目中如何划分vlan的&#xff1f; 采用静态VLAN的划分方式&#xff0c;可以按照楼层划分&#xff0c;可以按安装科室划分 23、vlan 的链路…...

Vue 绑定style和class

在应用界面中&#xff0c;某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式&#xff0c;可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于&#xff1a;类名不确定&#xff0c;需要动态指…...

【Electron+Vue】Error: error:0308010C:digital envelope routines::unsupported

问题描述 使用 electron-builder 构建 vue 项目&#xff0c;运行 npm run electron:build &#xff0c;构建过程报错。 / Bundling main process...ERROR Failed to compile with 1 errors …...

第7章 验证你的 Micro SaaS 应用程序构想

虽然可以使用一些软性验证技术,但要完全验证你的 Micro SaaS 创意,其实只有一种方法:为你的应用程序打造一个最基本的 MVP(最小化可行产品)版本,把它放出去,看看人们是否愿意为它买单。 不过,在开始构建 MVP 之前,您也可以利用一些软性验证检查,然后再继续编写应用程…...

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …...

【Java 进阶篇】JavaScript 中的全局对象和变量

JavaScript 是一门非常强大的编程语言&#xff0c;它提供了许多全局对象和变量&#xff0c;以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量&#xff0c;包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …...

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…...

“之江创客”跨境电商赛区决赛暨浙南新电商发展论坛圆满落幕

9月26日&#xff0c;由商务部中国国际电子商务中心指导&#xff0c;浙江省商务厅等十个部门主办&#xff0c;浙江省电子商务促进中心、温州市商务局、苍南县人民政府承办的“之江创客”2023全球电子商务创业创新大赛跨境电商赛区决赛暨浙南新电商发展论坛在苍南圆满落幕。浙江省…...

使用antd-pro脚手架搭建react ts项目

Pro 中使用 TypeScript 来作为默认的开发语言&#xff0c;TypeScript 的好处已经无须赘述&#xff0c;无论是开发成本还是维护成本都能大大减少&#xff0c;是中后台开发的必选。 初始化 提供了 pro-cli 来快速的初始化脚手架。 # 使用 npm npm i ant-design/pro-cli -g pro…...

推荐几款简单易用的协作化项目管理工具

您是否正在寻找一种有效且简单的项目管理工具来帮助您与团队成员协作?项目管理工具在当今的商业世界中已经变得必不可少&#xff0c;因为它们帮助团队保持组织和生产力。找到合适的工具是困难的&#xff0c;因为有太多的选择。有些工具是为特定类型的项目设计的&#xff0c;而…...

【Redis】Hash 哈希相关的命令

命令 HSET 设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]HGET 获取hash中指定字段的值。 HGET key fieldHEXISTS 判断hash中是否有指定的字段。 HEXISTS key fieldHDEL 删除hash中指定…...

人大金仓分析型数据库常见性能原因

目录 硬件失效 管理负载 避免竞争 统计信息 识别问题 调整统计 优化分布 优化设计 硬件失效 数据库的性能取决于它所运行的硬件基础设施。数据库由多台服务器&#xff08;主机&#xff09;构成&#xff0c;它们作为一个紧密的系统&#xff08;阵列&#xff09;一起工作。…...

【OpenCv光流法进行运动目标检测】

opencv系列文章目录 文章目录 opencv系列文章目录前言一、光流法是什么&#xff1f;二、光流法实例1.C的2.C版本3.python版本 总结 前言 随着计算机视觉技术的迅猛发展&#xff0c;运动目标检测在图像处理领域中扮演着至关重要的角色。在现实世界中&#xff0c;我们常常需要追…...

Word论文封面下划线怎么都对不齐

我们常常发现&#xff0c;无论是写论文还是平时填写word封面的信息的时候&#xff0c;下划线老是随着字符的多少的边长变短&#xff0c;我们使用空格键也非常不好对齐&#xff0c;这就给我们造成了很大的烦恼&#xff0c;想想自己也是这样&#xff0c;我一旦输入字符&#xff0…...

汇编经典程序——将一个字节数据以十六进制形式显示

法一&#xff1a; 由于0-9的ASCII码实际值30h&#xff0c;A-Z的ASCII码实际值37h&#xff0c;故直接加对应的数即可 ;该程序将一个字节数据以十六进制形式显示&#xff08;直接加对应数值&#xff09;.model small .stack .data hex db 4bh.code .startup;显示高位mov al,hex…...

Remix 开发小技巧(五)

文章目录 类型安全的 Fetcher 钩子一切从资源路由开始RPC 只是使用内置的 URL 获取使用 Zod 验证您的 RPC下一步是自定义提取器钩子 黑暗模式主题切换“最佳用户体验”是什么意思&#xff1f;第一个要求第二个要求第三个要求第四个要求 类型安全的 Fetcher 钩子 RPC 是一种远程…...

hive抽取mysql里的表,如果mysql表没有时间字段如何做增量抽取数据

如果MySQL表中没有时间字段&#xff0c;你可以通过其他方式实现增量抽取数据&#xff0c;以下是一些常见的方式&#xff1a; 使用自增主键&#xff1a;如果MySQL表中有自增主键&#xff0c;你可以记录上一次抽取数据时最大的主键值&#xff08;即上一次抽取数据的结束位置&…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...