当前位置: 首页 > 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;即上一次抽取数据的结束位置&…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...