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地址时,不需要进行字节序转换。只需确保按正确的顺序使用地址的各个部分。
为了更清晰地解释这一点,我们需要先理解为什么需要考虑字节序的问题,以及在何种情况下不需要考虑。
字节序
字节序是指在多字节数据中,较高有效位和较低有效位的存放顺序。主要有两种字节序:
- 大端序 (Big-Endian):较高的有效位被保存在地址较小的存储器地址中,而较低的有效位被保存在地址较大的存储器地址中。
- 小端序 (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请求或响应,并使用AF_PACKET套接字发送,需要手动创建整个以太网帧。 下面是一个简单的C代码示例,用于发送一个ARP请求,查询给定IP地址的MAC地址: #include <stdio.h> #include <stdlib.h> …...
C++下载器程序:如何使用cpprestsdk库下载www.ebay.com图片
本文介绍了如何使用C语言和cpprestsdk库编写一个下载器程序,该程序可以从www.ebay.com网站上下载图片,并保存到本地文件夹中。为了避免被网站屏蔽,我们使用了亿牛云爬虫代理服务提供的代理IP地址,以及多线程技术提高下载效率。 首…...
java springboot通过EnableConfigurationProperties全局声明bean并处理装配
Spring Boot中 我们想条件装配一个类 首先 我们要声明他的bean 而 EnableConfigurationProperties 可以直接将 要全局声明的类绑定在 属性类中 例如 我们随便创建一个类 就叫 textData 吧 参考代码如下 package com.example.webdom.domain;import org.springframework.boot.co…...
网络工程师知识点2
21、VLAN 有什么作用? ①广播控制;②安全性;③增加带宽利用率;④减少延迟。 22、实际的项目中如何划分vlan的? 采用静态VLAN的划分方式,可以按照楼层划分,可以按安装科室划分 23、vlan 的链路…...
Vue 绑定style和class
在应用界面中,某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式,可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于:类名不确定,需要动态指…...
【Electron+Vue】Error: error:0308010C:digital envelope routines::unsupported
问题描述 使用 electron-builder 构建 vue 项目,运行 npm run electron:build ,构建过程报错。 / Bundling main process...ERROR Failed to compile with 1 errors …...
第7章 验证你的 Micro SaaS 应用程序构想
虽然可以使用一些软性验证技术,但要完全验证你的 Micro SaaS 创意,其实只有一种方法:为你的应用程序打造一个最基本的 MVP(最小化可行产品)版本,把它放出去,看看人们是否愿意为它买单。 不过,在开始构建 MVP 之前,您也可以利用一些软性验证检查,然后再继续编写应用程…...
【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解
SSL(Secure Socket Layer,安全套接字层)证书是一种数字证书,用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证,是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点: …...
【Java 进阶篇】JavaScript 中的全局对象和变量
JavaScript 是一门非常强大的编程语言,它提供了许多全局对象和变量,以便于在整个应用程序中共享数据和功能。本文将详细介绍 JavaScript 中的全局对象和变量,包括全局对象、全局变量、全局函数以及它们的用途和示例。 全局对象 JavaScript …...
Stm32_标准库_12_串口_发送数据
波特率:约定的传输速率,1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码: #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…...
“之江创客”跨境电商赛区决赛暨浙南新电商发展论坛圆满落幕
9月26日,由商务部中国国际电子商务中心指导,浙江省商务厅等十个部门主办,浙江省电子商务促进中心、温州市商务局、苍南县人民政府承办的“之江创客”2023全球电子商务创业创新大赛跨境电商赛区决赛暨浙南新电商发展论坛在苍南圆满落幕。浙江省…...
使用antd-pro脚手架搭建react ts项目
Pro 中使用 TypeScript 来作为默认的开发语言,TypeScript 的好处已经无须赘述,无论是开发成本还是维护成本都能大大减少,是中后台开发的必选。 初始化 提供了 pro-cli 来快速的初始化脚手架。 # 使用 npm npm i ant-design/pro-cli -g pro…...
推荐几款简单易用的协作化项目管理工具
您是否正在寻找一种有效且简单的项目管理工具来帮助您与团队成员协作?项目管理工具在当今的商业世界中已经变得必不可少,因为它们帮助团队保持组织和生产力。找到合适的工具是困难的,因为有太多的选择。有些工具是为特定类型的项目设计的,而…...
【Redis】Hash 哈希相关的命令
命令 HSET 设置hash中指定的字段(field)的值(value)。 HSET key field value [field value ...]HGET 获取hash中指定字段的值。 HGET key fieldHEXISTS 判断hash中是否有指定的字段。 HEXISTS key fieldHDEL 删除hash中指定…...
人大金仓分析型数据库常见性能原因
目录 硬件失效 管理负载 避免竞争 统计信息 识别问题 调整统计 优化分布 优化设计 硬件失效 数据库的性能取决于它所运行的硬件基础设施。数据库由多台服务器(主机)构成,它们作为一个紧密的系统(阵列)一起工作。…...
【OpenCv光流法进行运动目标检测】
opencv系列文章目录 文章目录 opencv系列文章目录前言一、光流法是什么?二、光流法实例1.C的2.C版本3.python版本 总结 前言 随着计算机视觉技术的迅猛发展,运动目标检测在图像处理领域中扮演着至关重要的角色。在现实世界中,我们常常需要追…...
Word论文封面下划线怎么都对不齐
我们常常发现,无论是写论文还是平时填写word封面的信息的时候,下划线老是随着字符的多少的边长变短,我们使用空格键也非常不好对齐,这就给我们造成了很大的烦恼,想想自己也是这样,我一旦输入字符࿰…...
汇编经典程序——将一个字节数据以十六进制形式显示
法一: 由于0-9的ASCII码实际值30h,A-Z的ASCII码实际值37h,故直接加对应的数即可 ;该程序将一个字节数据以十六进制形式显示(直接加对应数值).model small .stack .data hex db 4bh.code .startup;显示高位mov al,hex…...
Remix 开发小技巧(五)
文章目录 类型安全的 Fetcher 钩子一切从资源路由开始RPC 只是使用内置的 URL 获取使用 Zod 验证您的 RPC下一步是自定义提取器钩子 黑暗模式主题切换“最佳用户体验”是什么意思?第一个要求第二个要求第三个要求第四个要求 类型安全的 Fetcher 钩子 RPC 是一种远程…...
hive抽取mysql里的表,如果mysql表没有时间字段如何做增量抽取数据
如果MySQL表中没有时间字段,你可以通过其他方式实现增量抽取数据,以下是一些常见的方式: 使用自增主键:如果MySQL表中有自增主键,你可以记录上一次抽取数据时最大的主键值(即上一次抽取数据的结束位置&…...
终极指南:3步掌握yfinance金融数据获取与智能修复实战
终极指南:3步掌握yfinance金融数据获取与智能修复实战 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance yfinance是一个强大的Python库,能够从Yahoo! Finan…...
Apex Legends进阶指南:结构化训练框架与技能模块化拆解
1. 项目概述:一个面向Apex Legends玩家的成长型技能库如果你是一位《Apex Legends》的玩家,并且对提升自己的游戏水平有持续的热情,那么你很可能和我一样,经历过一个漫长的摸索期。从最初落地成盒,到逐渐熟悉地图、枪械…...
MySQL 索引底层 B+ 树原理
聊 MySQL 索引,不讲 B 树,那就是在耍流氓。 大家好,我是乱码字符。今天咱们深入聊聊 MySQL 索引的底层数据结构——B 树。这篇文章能让你彻底搞明白,为什么有时候明明加了索引,查询却还是慢成狗。 先说说为什么要用树结…...
Midjourney湿版摄影风格实战手册(从胶片化学原理到Prompt工程):含12组经大英博物馆湿版藏品验证的Reference Prompt库
更多请点击: https://intelliparadigm.com 第一章:湿版摄影的历史溯源与Midjourney风格化转译本质 湿版摄影(Wet Plate Collodion Process)诞生于1851年,由弗雷德里克斯科特阿彻(Frederick Scott Archer&a…...
【Midjourney数字艺术风格终极指南】:20年AI视觉专家亲授7大核心风格参数调优法则(含V6.1新增Realism Mode实测数据)
更多请点击: https://intelliparadigm.com 第一章:Midjourney数字艺术风格演进与V6.1核心变革 Midjourney自V1发布以来,其图像生成范式经历了从纹理模拟到语义理解、从风格模仿到跨模态协同的深层跃迁。V6.1标志着模型首次在原生架构中集成…...
从仿生结构到步态算法:8自由度并联腿机器狗行走全解析
1. 8自由度并联腿机器狗的结构奥秘 第一次拆解机器狗时,我对着那些复杂的连杆结构发了半小时呆。直到发现它的腿部运动原理和公园里的跷跷板惊人相似——这个发现让我瞬间理解了8自由度并联腿的精妙之处。这种结构就像给机器人装上了"机械肌腱"࿰…...
面试鸭:程序员面试备战工作台,构建结构化知识图谱与智能复习系统
1. 项目概述:一个面向求职者的“面试鸭”最近在技术社区里,看到不少朋友在讨论一个叫“mianshiya”的开源项目。乍一看这个名字,还以为是哪个美食博主分享的菜谱。点进去才发现,这其实是一个为程序员,特别是正在准备面…...
AXI Crossbar设计解析:从总线互联原理到SoC集成实战
1. 项目概述:AXI Crossbar,不仅仅是“总线交叉开关”在复杂的数字系统设计,尤其是SoC(片上系统)和FPGA应用中,我们常常面临一个核心问题:多个主设备(Master,如CPU、DMA控…...
基于声明式Web自动化框架Hydra的电商数据监控实战
1. 项目概述:一个被低估的自动化利器 如果你经常需要处理一些重复性的、基于Web界面的操作,比如批量下载某个网站的资源、定时填写表单、或者监控网页内容的变化,那么你很可能已经厌倦了手动点击和等待。传统的脚本编写,尤其是涉及…...
基于强化学习的机器人抓取:从PPO/SAC算法到仿真部署全解析
1. 项目概述:一个基于强化学习的机器人抓取开源项目最近在机器人控制领域,强化学习(Reinforcement Learning, RL)的应用越来越火,尤其是在需要高精度、高适应性的任务上,比如机器人抓取。传统的抓取规划方法…...
